zoukankan      html  css  js  c++  java
  • 003-k8s集群安装、配置私有化仓库、集群与仓库联合使用

    一、概述

      官方提供的三种Kubernetes部署方式:

        minikube   Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用。不能用于生产环境。官方地址:https://kubernetes.io/docs/setup/minikube/

        kubeadm   Kubeadm也是一个工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

        二进制包   从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。

      Harbor:仓库;

      操作系统:centos7以上【docker采用了很多名称空间,在centos6中都是不支持的,所以采用centos7,内核≥4.4最好,否则有些docker出bug】,需要4台centos7

    二、 集群部署

    3.1、创建三台机器

    10.0.0.79   k8s-master01
    10.0.0.80    k8s-node01
    10.0.0.81    k8s-node02

    3.2、配置主机名称及host【每台机器执行】

    #设置
    hostnamectl set-hostname k8s-master01
    hostnamectl set-hostname k8s-node01
    hostnamectl set-hostname k8s-node02
    
    #查看
    hostname
    
    #临时修改主机名:hostname 临时主机名
    #永久修改主机名:hostnamectl 永久主机名    是对/etc/hostname文件的内容进行修改

    host配置

    大型项目搭建DNS,小型直接配置host

    vi /etc/hosts
    10.0.0.79    k8s-master01
    10.0.0.80    k8s-node01
    10.0.0.81    k8s-node02

    host 拷贝【与上面每台执行,或者其中一个执行,其他拷贝】

    scp /etc/hosts root@10.0.0.80:/etc/hosts
    scp /etc/hosts root@10.0.0.81:/etc/hosts

    3.3、安装依赖包【每台机器执行】

    yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git

    3.4、设置防火墙为 Iptables 并设置空规则【每台机器执行】

    # 关闭7的防火墙
    systemctl stop firewalld && systemctl disable firewalld
    # 安装新的iptables
    yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

    3.5、关闭selinux【每台机器执行】

    # 关闭swap,防止容器在虚拟内存运行
    swapoff -a && sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab
    #关闭SELINUX
    setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

    3.6、优化内核参数【每台机器执行】

    #创建文件
    cat > kubernetes.conf <<EOF
    net.bridge.bridge-nf-call-iptables=1
    net.bridge.bridge-nf-call-ip6tables=1
    net.ipv4.ip_forward=1
    net.ipv4.tcp_tw_recycle=0
    vm.swappiness=0 #禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
    vm.overcommit_memory=1 # 不检查物理内存是否够用
    vm.panic_on_oom=0 #开启 OOM
    fs.inotify.max_user_instances=8192
    fs.inotify.max_user_watches=1048576
    fs.file-max=52706963
    fs.nr_open=52706963
    net.ipv6.conf.all.disable_ipv6=1
    net.netfilter.nf_conntrack_max=2310720
    EOF

    拷贝和使其生效

    # 拷贝
    cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
    # 使其生效
    sysctl -p /etc/sysctl.d/kubernetes.conf

    如果文件不生效,升级4.4即可

    3.7、调整系统时区【每台机器执行】

    先查看一个:timedatectl,符合的话不用执行

    # 设置系统时区为 中国/上海
    timedatectl set-timezone Asia/Shanghai
    # 将当前的 UTC 时间写入硬件时钟
    timedatectl set-local-rtc 0
    # 重启依赖于系统时间的服务
    systemctl restart rsyslog
    systemctl restart crond

    同步日期:ntpdate time1.aliyun.com

    关闭不需要的服务【每台机器执行】

    systemctl stop postfix.service && systemctl disable postfix.service

    3.8、设置 rsyslogd 和 systemd journald【每台机器执行】

    # 持久化日志方式
    mkdir /var/log/journal
    mkdir /etc/systemd/journald.conf.d

    写入配置

    cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
    [Journal]
    # 持久化保存到磁盘
    Storage=persistent
    # 压缩历史日志
    Compress=yes
    SyncIntervalSec=5m
    RateLimitInterval=30s
    RateLimitBurst=1000
    # 最大占用空间 10G
    SystemMaxUse=10G
    # 单日志文件最大 200M
    SystemMaxFileSize=200M
    # 日志保存时间 2 周
    MaxRetentionSec=2week
    # 不将日志转发到 syslog
    ForwardToSyslog=no
    EOF

    重启服务

    systemctl restart systemd-journald

    3.9、升级系统内核为 4.44【每台机器执行】

    # 内核查看
    uname -r

      CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定,升级如下:

    rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
    # 安装完成后检查  /boot/grub2/grub.cfg 中对应内核menuentry 中是否包含initd16配置,如果没有,再试一次
    yum --enablerepo=elrepo-kernel install kernel-lt
    # 设置开机从新内核启动【注意内核号 是步安装的内核号】
    grub2-set-default  "CentOS Linux (4.4.232-1.el7.elrepo.x86_64) 7 (Core)" 

    查看内核即可:uname -r 

    3.10、kube-proxy开启ipvs的前置条件【每台机器执行】

    #1、加载netfilter模块
    modprobe br_netfilter  
    
    #2、添加配置文件
    
    cat  >  /etc/sysconfig/modules/ipvs.modules  <<EOF
    #!/bin/bash
    modprobe  --  ip_vs
    modprobe  --  ip_vs_rr
    modprobe  --  ip_vs_wrr
    modprobe  --  ip_vs_sh
    modprobe  --  nf_conntrack_ipv4
    EOF
    
    #3、赋予权限并引导
    
    chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules &&lsmod | grep -e ip_vs -e nf_conntrack_ipv4

    检测:lsmod | grep -e ipvs -e nf_conntrack_ipv4  或者 lsmod | grep  ip_vs 

    3.11、安装docker【每台机器执行】

    #1、docker依赖
    yum install -y yum-utils device-mapper-persistent-data lvm2
    
    #2、导入阿里云的docker-ce仓库
    yum-config-manager  
    --add-repo  
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    #3、更新系统安装docker-ce
    yum update -y 
    yum install -y docker-ce
    
    #4uname -r  检测版本,再设置版本,后又重启reboot
    grub2-set-default "CentOS Linux (4.4.232-1.el7.elrepo.x86_64) 7 (Core)"
    reboot
    
    #5、启动docker  && 开机自启
    systemctl start docker && systemctl enable docker
    
    #6、配置deamon
    cat > /etc/docker/daemon.json <<EOF
    {
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
    "log-opts": {
    "max-size": "100m"
    }
    }
    EOF
    
    #7、创建目录存放docker配置文件
    mkdir -p  /etc/systemd/system/docker.service.d   
    
    #8、重启docker
    systemctl daemon-reload && systemctl restart docker && systemctl enable docker

    3.12、安装Kubeadm(主从配置)【每台机器执行】

    #1、导入阿里云的YUM仓库
    cat  <<EOF >  /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
    http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    
    #2、在每个节点安装kubeadm(初始化工具)、kubectl(命令行管理工具)、kubelet(与docker的cri交互创建容器)
    yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1  
    
    
    # 3、k8s开机自启.kubelet需要与容器接口进行交互启动容器,而k8s通过Kubeadm安装出来以后都是以pod方式存在,也就是底层以容器的方式运行,所以一定要开机自启
    systemctl enable kubelet.service

    在线安装

    部署master(意ip请更换成自己环境中的主节点ip)【仅在master执行】

    kubeadm init --apiserver-advertise-address=10.0.0.79 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.15.1 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16

    效果:docker images

      

    配置kubectl

    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config

    查看

    kubectl get node
    #NAME           STATUS     ROLES    AGE   VERSION
    #k8s-master01   NotReady   master   27m   v1.15.1

    开启IPVS【master】

    kubectl edit cm kube-proxy -n kube-system
    # mode字段,默认为“”,修改为 ipvs
    #删除所有的 标签为kube-proxy的 po实例,k8s会自动按新的配置安装新的kube-proxy
    
    kubectl delete pod -l k8s-app=kube-proxy  -n kube-system

    3.13、网络部署

    1》fannel部署

      一般的网络无法访问quay.io,找国内的镜像源,或者从docker hub上拉取flannel的镜像,此处选择第2种方式。

    手动拉取flannel镜像【【每台机器执行】

    # 手动拉取flannel的docker镜像
    docker pull easzlab/flannel:v0.11.0-amd64
    # 修改镜像名称
    docker tag easzlab/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64

    下载并安装flannel资源配置清单【仅在master执行】

    wget  https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    kubectl apply -f kube-flannel.yml  

    查看fannel是否运行:kubectl get  pod -n kube-system

    以及查看节点状态:kubectl get node

    2》节点网络加入【仅在子节点】

      使用kubeadm join 注册Node节点到Matser

      节点如何加入,其实在(kubeadm join 的内容,在上面kubeadm init (kubeadm init输出结果的最后已写明) 已经生成了)

    kubeadm join 10.0.0.79:6443 --token xxtjuv.v3xbd8b9zie6muab 
        --discovery-token-ca-cert-hash sha256:5e7bf9bd4200361259ecd76c4b9a72fcf8ffc5740cf13cb4517e552fac5c4072

    查看集群的node状态,安装完网络工具之后,所有节点全部都Ready好了之后才能继续后面的操作 

    kubectl get nodes
    kubectl get pods -n kube-system 

     至此使用kubeadm的方式安装k8s v1.15完毕

    3.14、新节点加入

    后续有nodes节点想加入集群的话,由于默认token的有效期为24小时,当过期之后,该token就不可用了,解决方法如下:
    1、查看:kubeadm token list
    2、重新生成新的token ==> kubeadm token create
    3、再次查看:kubeadm token list
    4、获取ca证书sha256编码hash值
    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
    5、节点接入集群
    kubeadm join --token 369tcl.oe4punpoj9gaijh7(新的token) --discovery-token-ca-cert-hash sha256:7ae10591aa593c2c36fb965d58964a84561e9ccd416ffe7432550a0d0b7e4f90(ca证书sha256编码hash值) 主节点Ip:6443 --skip-preflight-chec

    3.15、常用命令

    //查看节点信息
    kubectl get pod -n kube-system
    kubectl get pod -n kube-system -w //监视
    查看:pod kubectl get pod -n kube-system -o wide
    -o wide参数可查看详细信息(属于哪个node)
    -w 阻塞窗口持续监视状态(watch)

    3.16、测试kubernetes集群

    kubectl create deployment nginx --image=nginx
    # deployment.apps/nginx created
    kubectl describe pod nginx
    查看:kubectl get pod -o wide
    测试访问:curl 10.244.1.2

    四、配置私有化仓库

    执行3.9、3.11后进行如下操作。

    4.1、基于centos7.4.升级内核、安装docker

    在上述每台机器【4台机器】内执行【具体是ip还是域名,看个人配置】

    vim /etc/docker/daemon.json
    "insecure-registries": ["https://hub.k8s.com"]
    systemctl restart docker 

    或ip方式:"insecure-registries": ["xx.xx.xx.xx:8081"]

    注意,几台机器注意配置host,如果是ip即不用配置

    echo "10.0.0.82    hub.k8s.com" >> /etc/hosts

    注意上述域名,根据实际情况填写 具体的 域名或者IP即可  

    "insecure-registries": ["xx.xx.xx.xx:8081"]

    4.2、docker-compose安装

    sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose   #给docker-compose执行权限
    docker-compose --version   #测试安装是否成功,成功的话打印出docker-compose的版本信息 

    4.3、创建https证书

    方式一、最简单方式

    mkdir -p /data/cert && chmod -R 777 /data/cert && cd /data/cert
    openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:2048 -keyout harbor.key -out harbor.crt -subj "/CN=hub.k8s.com"

    注意域名修改

    方式二、去私钥方式

    # 创建证书目录,并赋予权限
    mkdir -p /data/cert && chmod -R 777 /data/cert && cd /data/cert
    # 生成私钥,需要设置密码
    openssl genrsa -des3 -out harbor.key 2048
    
    # 生成CA证书,需要输入密码
    openssl req -sha512 -new 
        -subj "/C=CN/ST=JS/L=WX/O=zwx/OU=jhmy/CN=hub.k8s.com" 
        -key harbor.key 
        -out harbor.csr
    
    # 备份证书
    cp harbor.key harbor.key.org
    
    # 退掉私钥密码,以便docker访问(也可以参考官方进行双向认证)
    openssl rsa -in harbor.key.org -out harbor.key
    
    # 使用证书进行签名
    openssl x509 -req -days 365 -in harbor.csr -signkey harbor.key -out harbor.crt
    View Code

    方式三、官方认证方式

    https://goharbor.io/docs/1.10/install-config/configure-https/

    4.4、harbor下载

    下载地址:https://github.com/goharbor/harbor/releases

    wget https://github.com/goharbor/harbor/releases/download/v1.10.4/harbor-offline-installer-v1.10.4.tgz

    解压安装单机版【使用https比较麻烦的话,可以直接将下述https注释即可】

    #解压
    tar -zvxf harbor-offline-installer-v1.10.4.tgz
    
    #移动位置
    mv harbor /usr/local/
    cd /usr/local/harbor
    # 编辑harbor.yml,修改hostname、https证书路径、admin密码
    vim harbor.yml
    # certificate: /data/cert/harbor.crt
    # private_key: /data/cert/harbor.keydocke 

    注意hostname 填写 ip或域名即可

    安装

    #运行install.sh即可(可带参数--with-notary启用镜像签名,--with-clair启用漏洞扫描)
    #流程:检查环境  ->  导入镜像  -> 准备环境  ->  准备配置(含移除旧版本)->  开始启动
    ./install 

    4.5、测试

    方式一、浏览器直接访问

    这里使用的是ip,故直接访问:10.0.0.82

    用户密码:admin/Harbor12345

    方式二、其他主机

    docker login 10.0.0.82

    输入用户密码测试即可

    4.5.1、镜像测试,在其他机器

    docker pull wangyanglinux/myapp:v1 

    在library下可以查看到

    在项目中标记镜像:

    docker tag SOURCE_IMAGE[:TAG] 10.0.0.82/library/IMAGE[:TAG]  如上:docker tag wangyanglinux/myapp:v1  10.0.0.82/library/myapp:v1

    推送镜像到当前项目:

    docker push 10.0.0.82/library/IMAGE[:TAG]  如上:docker push 10.0.0.82/library/myapp:v1

    注意提前登陆下 

    在当前节点下 删除上述两个 image

    docker rmi -f 10.0.0.82/library/myapp:v1

    docker rmi -f wangyanglinux/myapp 

    4.5.2、通过kube使用镜像

    library默认是公开的都可以使用

    k8s master下

    1》启动pod

    kubectl run --help 帮助

    kubectl run nginx-deployment --image=10.0.0.82/library/myapp:v1 --port=80 --replicas=1

    查看deployment:kubectl get deployment   # nginx-deployment   1/1     1            1           48s

    查看rs:kubectl get rs            # nginx-deployment-5fd648dfb   1         1         1       101s

    查看pod:kubectl get pod           # nginx-deployment-5fd648dfb-hh6l6   1/1     Running   0          3m12s

    查看pod容器:kubectl get pod -o wide     # nginx-deployment-5fd648dfb-hh6l6   1/1     Running   0          4m14s   10.244.1.6   k8s-node01

      可以在对应容器查看,实际run的docker,同时会发现一个pause容器

      访问私有ip:curl 10.244.1.6         #  Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

      访问:curl 10.244.1.6/hostname.html     #  nginx-deployment-5fd648dfb-hh6l6 

    4.5.3、更多使用

    1》如误删除了pod:kubectl delete pod nginx-deployment-5fd648dfb-hh6l6

      使用:kubectl get pod查看,发现又被创建了,因为上述设置了副本为1,所以删除了还是会有的

      nginx-deployment-5fd648dfb-ljwf9   1/1     Running   0          23s

    2》副本增容:kubectl scale --replicas=3 deployment/nginx-deployment

      使用:kubectl get pod查看

      nginx-deployment-5fd648dfb-478td   1/1     Running   0          28s

      nginx-deployment-5fd648dfb-ljwf9   1/1     Running   0          2m58s

      nginx-deployment-5fd648dfb-swtbd   1/1     Running   0          28s

    3》副本比较多访问方案:

      原方案使用nginx负载一下

      参看上文:002-k8s核心概念、Pod、网络通讯方式 中1.2.使用nodeport方案对外映射端口

      创建hub

      通过:kubectl expose --help查看

      查看:service:kubectl get svc

      配置:kubectl expose deployment nginx-deployment --port=30000 --target-port=80

      查看测试:nginx-deployment   ClusterIP   10.1.0.242   <none>        30000/TCP   28s

        curl 10.1.0.242:30000          # Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

        curl 10.1.0.242:30000/hostname.html  # 自由负载 :nginx-deployment-5fd648dfb-478td、nginx-deployment-5fd648dfb-ljwf9、nginx-deployment-5fd648dfb-swtbd

      查看ipvsadm:ipvsadm -Ln

    TCP  10.1.0.242:30000 rr

      -> 10.244.1.7:80                Masq    1      0          0         

      -> 10.244.2.2:80                Masq    1      0          0         

      -> 10.244.2.3:80                Masq    1      0          0   

      查看pod:

    nginx-deployment-5fd648dfb-478td   1/1     Running   0          175m   10.244.2.3   k8s-node02   <none>           <none>

    nginx-deployment-5fd648dfb-ljwf9   1/1     Running   0          177m   10.244.2.2   k8s-node02   <none>           <none>

    nginx-deployment-5fd648dfb-swtbd   1/1     Running   0          175m   10.244.1.7   k8s-node01   <none>           <none>

       可以看到互相匹配的

    3》外部访问

      修改类型:kubectl edit svc nginx-deployment   # 将  ClusterIP 转 NodePort

      参看svc: kubectl get svc          # nginx-deployment   NodePort    10.1.0.242   <none>        30000:31805/TCP  # 外部访问 IP:31805就可访问了

      查看端口开放:netstat -anpt|grep 31805  或者 ss -ant|grep 31805

      

     

     

     

  • 相关阅读:
    6.25作业
    博客园第一篇
    532. 数组中的K-diff数对
    echarts
    跨域问题
    数组中第三大的数 leetcode 414
    除自身以外数组的乘积leetcode 238
    xshell工具
    插入、删除和随机查询时间复杂度都为O(1) leetcode 381
    组合总和3 leetcode 216
  • 原文地址:https://www.cnblogs.com/bjlhx/p/13501739.html
Copyright © 2011-2022 走看看