zoukankan      html  css  js  c++  java
  • 86) 离线二进制安装kubernetes v1.18.5 生产CI-CD环境 [1. 环境部署篇]

    1- 环境规划说明

    1.1- 系统环境

    • 节点信息
    节点角色 主机名 IP cpu ram disk kernel 组件
    master/worker master 192.168.23.135 2 8G 80G kernel-lt-4.4.227 etcd
    docker
    flannel
    kube-scheduler
    kube-controller-mananger
    kube-apiserver
    kubelet
    kube-proxy

    minio
    nfs
    docker repository
    worker node-1 192.168.23.136 2 8G 80G kernel-lt-4.4.227 etcd
    docker
    flannel
    kubelet
    kube-proxy
    worker node-2 192.168.23.137 2 8G 80G kernel-lt-4.4.227 etcd
    docker
    flannel
    kubelet
    kube-proxy

    1.2- 集群架构

    1.3- 组件版本

    组件 版本 二进制包下载地址
    kubernetes v1.18.5 https://dl.k8s.io/v1.18.5/kubernetes-server-linux-amd64.tar.gz
    docker-ce 18.03 https://download.docker.com/linux/static/stable/x86_64/docker-18.03.0-ce.tgz
    flannel 0.11 https://github.com/coreos/flannel/releases/download/v0.11.0/flannel-v0.11.0-linux-amd64.tar.gz
    etcd 3.3.10 https://github.com/etcd-io/etcd/releases/download/v3.3.10/etcd-v3.3.10-linux-amd64.tar.gz
    mino https://dl.min.io/server/minio/release/linux-amd64/minio
    cfssl 1.12.0 https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
    kubernetes-dashboard 2.0.3 https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
    kernel-lt-4.4.227 4.4.227 https://elrepo.org/linux/kernel/el7/x86_64/RPMS/

    组件百度云下载地址:

    2- 环境准备[所有节点]

    2.1- 系统环境初始化

    • 下载软件包上传到服务器[master]
    cd /tmp
    [root@master tmp]# ls
    k8s-software.tar.gz
    
    • 解压包
    tar -xvf k8s-software.tar.gz
    ls -l
    
    dr-xr-x--- 2 1001  513         58 Jul 24 18:51 cfssl-1.12.0     
    -r-xr-x--- 1 1001  513     378880 Jun 26 01:59 codedns.tar.gz 
    -r-xr-x--- 1 1001  513       7552 Jul  5 18:50 dashboard-v2.0.3.yaml
    dr-xr-x--- 2 1001  513        177 Jul 24 18:52 docker-ce-18.03
    dr-xr-x--- 2 1001  513         33 Jul 24 18:52 etcd-3.3.10
    dr-xr-x--- 2 1001  513         47 Jul 24 18:52 flannel-0.11
    -rw-r--r-- 1 root root 1056826368 Jul 25 01:56 k8s-software.tar.gz
    -r-xr-x--- 1 1001  513   41209720 Jun 29 10:19 kernel-lt-4.4.227-1.el7.elrepo.x86_64.rpm
    -r-xr-x--- 1 1001  513   10711232 Jun 29 10:18 kernel-lt-devel-4.4.227-1.el7.elrepo.x86_64.rpm
    dr-xr-x--- 2 1001  513        175 Jul 24 18:52 kubernetes-v.1.18.5
    -r-xr-x--- 1 1001  513       4687 Jul  5 19:07 kubernetes-dashboard.yaml
    -r-xr-x--- 1 1001  513  227409920 Jul  5 19:07 kubernetesui-dashboard-v2.0.3.tar.gz
    -r-xr-x--- 1 1001  513   36961280 Jul  5 19:07 kubernetesui-metrics-scraper-v1.0.4.tar.gz
    -r-xr-x--- 1 1001  513     765440 Jun 26 19:31 pause-amd64-3.0.tar.gz
    -rw-r--r-- 1 root root   26806784 Jul 25 02:01 registry.tar.gz
    
    • 关闭防火墙和selinux
    systemctl stop firewalld
    systemctl disable firewalld
    setenforce 0
    sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    
    • 禁用swap分区
    swapoff -a
    sed -i.bak '/ swap / s/^(.*)$/#1/g' /etc/fstab
    
    • 升级内核到4.4版本
    wget     ##下载内核rpm包
    yum localinstall -y kernel-lt-*
    sed -i 'ssavedg' /etc/default/grub
    grub2-mkconfig -o /boot/grub2/grub.cfg
    

    2.2- 内核参数优化

    • 加载内核模块
    systemctl enable rc-local
    chmod a+x /etc/rc.d/rc.local
    systemctl restart rc-local
    
    cat >> /etc/rc.local  << EOF
    modprobe ip_vs_rr
    modprobe br_netfilter
    EOF
    
    • 使用systemd-modules-load加载内核模块
    cat > /etc/modules-load.d/ipvs.conf << EOF
    ip_vs_rr
    br_netfilter
    EOF
    
    systemctl enable --now systemd-modules-load.service
    
    • 内核参数优化
    cat >/etc/sysctl.d/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
    vm.overcommit_memory=1
    vm.panic_on_oom=0
    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
    
    sysctl -p /etc/sysctl.d/kubernetes.conf
    
    • 重启系统
    reboot
    

    3- 创建自签证书[master节点]

    3.1- 创建环境

    • 创建环境文件夹
    mkdir -p /opt/{etcd,k8s}
    mkdir -p /opt/etcd/{bin,tsl,config}
    mkdir -p /opt/k8s/{bin,tsl,config}
    
    • 下载cfssl自签工具
    cp /tmp/cfssl-1.12.0/cfssl* /usr/sbin/
    

    3.2- 创建etd证书

    • 创建ca证书
    cd /opt/etcd/tsl/
    cfssl print-defaults csr > etcd-ca.json
    ##修改etcd-ca.json
    cat etcd-ca.json
    {
        "CN": "etcd",
        "hosts": [
            "192.168.23.135",
            "192.168.23.136",
            "192.168.23.137",
            "127.0.0.1"
        ],
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "Shenzhen",
                "ST": "Nanshan"
            }
        ]
    }
    
    ## 初始化ca-key
    cfssl gencert -initca etcd-ca.json |cfssljson -bare etcd-ca -
    
    ls *pem
    etcd-ca-key.pem  etcd-ca.pem
    
    • 创建颁发集群服务器的证书
    cfssl print-defaults csr > etcd-server-csr.json
    cat etcd-server-csr.json
    {
        "CN": "etcd",
        "hosts": [
            "192.168.23.135",
            "192.168.23.136",
            "192.168.23.137",
            "127.0.0.1"
        ],
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "Shenzhen",
                "ST": "Nanshan"
            }
        ]
    }
    
    
    
    cfssl print-defaults config > etcd-ca-config.json
    cat etcd-ca-config.json
    {
        "signing": {
            "default": {
                "expiry": "87600h"
            },
            "profiles": {
                "etcd": {
                    "expiry": "87600h",
                    "usages": [
                        "signing",
                        "key encipherment",
                        "server auth"
                    ]
                },
                "client": {
                    "expiry": "87600h",
                    "usages": [
                        "signing",
                        "key encipherment",
                        "client auth"
                    ]
                }
            }
        }
    }
    
    cfssl gencert -ca=etcd-ca.pem -ca-key=etcd-ca-key.pem -config=etcd-ca-config.json --profile=etcd  etcd-server-csr.json |cfssljson -bare etcd-server -
    
    
    ls etcd*server*pem
    etcd-server-key.pem  etcd-server.pem
    
    

    3.3- 创建k8s证书

    cd /opt/k8s/tsl/
    
    • 创建ca证书
    cfssl print-defaults csr > k8s-ca.json
    cat k8s-ca.json
    {
        "CN": "k8s",
        "hosts": [
            "192.168.23.135",
            "192.168.23.136",
            "192.168.23.137",
            "127.0.0.1"
        ],
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "Shenzhen",
                "ST": "Nanshan"
            }
        ]
    }
    
    cfssl gencert -initca k8s-ca.json |cfssljson -bare k8s-ca -
    
    
    
    cfssl print-defaults config  > k8s-ca-config.json
    cat k8s-ca-config.json
    {
        "signing": {
            "default": {
                "expiry": "87600h"
            },
            "profiles": {
                "k8s": {
                    "expiry": "87600h",
                    "usages": [
                        "signing",
                        "key encipherment",
                        "server auth"
                    ]
                },
                "client": {
                    "expiry": "87600h",
                    "usages": [
                        "signing",
                        "key encipherment",
                        "client auth"
                    ]
                }
            }
        }
    }
    
    • 创建kube-apiserver证书
    cfssl print-defaults csr > k8s-apiserver.json
    
    cat k8s-apiserver.json
    {
        "CN": "k8s",
        "hosts": [
            "127.0.0.1",
            "192.168.23.135",
            "192.168.23.136",
            "192.168.23.137",
            "kubernetes",
            "kubernetes.default",
            "kubernetes.default.svc",
            "kubernetes.default.svc.k8s",
            "kubernetes.default.svc.k8s.local"
        ],
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "Shenzhen",
                "ST": "Nanshan",
                "O": "k8s",
                "OU": "System"
            }
        ]
    }
    
    cfssl gencert -ca=k8s-ca.pem -ca-key=k8s-ca-key.pem -config=k8s-ca-config.json -profile=k8s k8s-apiserver.json |cfssljson -bare k8s-apiserver -
    
    ls k8s-apiserver*pem
    k8s-apiserver-key.pem  k8s-apiserver.pem
    
    • 创建k8s-apiserver证书
    cfssl print-defaults csr > k8s-proxy.json
    cat  k8s-proxy.json
    {
        "CN": "k8s",
        "hosts": [
            "127.0.0.1",
            "192.168.23.135",
            "192.168.23.136",
            "192.168.23.137"
        ],
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "Shenzhen",
                "ST": "Nanshan",
                "O": "k8s",
                "OU": "System"
            }
        ]
    }
    
    cfssl gencert -ca=k8s-ca.pem -ca-key=k8s-ca-key.pem -config=k8s-ca-config.json -profile=k8s k8s-proxy.json |cfssljson -bare k8s-proxy -
    
    ls k8s-proxy*pem
    k8s-proxy-key.pem  k8s-proxy.pem
    
    

    4- 安装etcd集群[master节点]

    4.1- 创建集群文件

    • 下载上传etcd二进制文件[master节点]
    hostnamectl set-hostname master
    cp /tmp/etcd-3.3.10/etcd* /opt/etcd/bin/
    
    cd /opt/etcd/bin/
    [root@master bin]# ls
    etcd  etcdctl
    
    • 创建etcd配置文件
    vim /opt/etcd/config/etcd.cfg
    #[Member]
    ETCD_NAME="etcd01"
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_PEER_URLS="https://192.168.23.135:2380"
    ETCD_LISTEN_CLIENT_URLS="https://192.168.23.135:2379"
    
    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.23.135:2380"
    ETCD_ADVERTISE_CLIENT_URLS="https://192.168.23.135:2379"
    ETCD_INITIAL_CLUSTER="etcd01=https://192.168.23.135:2380,etcd02=https://192.168.23.136:2380,etcd03=https://192.168.23.137:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    ETCD_INITIAL_CLUSTER_STATE="new"
    
    • 创建 etcd的 systemd unit 文件
    [root@master bin]# cat /opt/etcd/config/etcd.service
    [Unit]
    Description=Etcd Server
    After=network.target
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    Type=notify
    EnvironmentFile=/opt/etcd/config/etcd.cfg
    ExecStart=/opt/etcd/bin/etcd 
    --name=${ETCD_NAME} 
    --data-dir=${ETCD_DATA_DIR} 
    --listen-peer-urls=${ETCD_LISTEN_PEER_URLS} 
    --listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 
    --advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} 
    --initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} 
    --initial-cluster=${ETCD_INITIAL_CLUSTER} 
    --initial-cluster-token=${ETCD_INITIAL_CLUSTER_TOKEN} 
    --initial-cluster-state=new 
    --cert-file=/opt/etcd/tsl/etcd-server.pem 
    --key-file=/opt/etcd/tsl/etcd-server-key.pem 
    --peer-cert-file=/opt/etcd/tsl/etcd-server.pem 
    --peer-key-file=/opt/etcd/tsl/etcd-server-key.pem 
    --trusted-ca-file=/opt/etcd/tsl/etcd-ca.pem 
    --peer-trusted-ca-file=/opt/etcd/tsl/etcd-ca.pem
    Restart=on-failure
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target
    

    4.2- 启动集群

    • 配置文件拷贝到 node-1,node-2[master节点]
    scp -r /opt/etcd/ root@192.168.23.136:/opt/
    scp -r /opt/etcd/ root@192.168.23.137:/opt/
    
    • 拷贝systemd服务器文件[master节点]
    ln -s /opt/etcd/config/etcd.service  /usr/lib/systemd/system/etcd.service
    
    • 修改另外两台机器配置文件[node1节点]
    hostnamectl set-hostname node-1
    
    [root@node-1 ~]# cat /opt/etcd/config/etcd.cfg
    #[Member]
    ETCD_NAME="etcd02"
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_PEER_URLS="https://192.168.23.136:2380"
    ETCD_LISTEN_CLIENT_URLS="https://192.168.23.136:2379"
    
    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.23.136:2380"
    ETCD_ADVERTISE_CLIENT_URLS="https://192.168.23.136:2379"
    ETCD_INITIAL_CLUSTER="etcd01=https://192.168.23.135:2380,etcd02=https://192.168.23.136:2380,etcd03=https://192.168.23.137:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    ETCD_INITIAL_CLUSTER_STATE="new"
    
    • 修改另外两台机器配置文件[node-2节点]
    hostnamectl set-hostname node-2
    [root@node-2 ~]# cat /opt/etcd/config/etcd.cfg
    #[Member]
    ETCD_NAME="etcd03"
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_PEER_URLS="https://192.168.23.137:2380"
    ETCD_LISTEN_CLIENT_URLS="https://192.168.23.137:2379"
    
    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.23.137:2380"
    ETCD_ADVERTISE_CLIENT_URLS="https://192.168.23.137:2379"
    ETCD_INITIAL_CLUSTER="etcd01=https://192.168.23.135:2380,etcd02=https://192.168.23.136:2380,etcd03=https://192.168.23.137:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    ETCD_INITIAL_CLUSTER_STATE="new"
    
    ln -s /opt/etcd/config/etcd.service  /usr/lib/systemd/system/etcd.service
    
    • 启动etcd服务[所有节点]
    systemctl daemon-reload
    systemctl enable etcd
    systemctl start etcd
    #启动ETCD集群同时启动二个节点,单节点是无法正常启动的。
    
    • 检查集群服务健康[任意节点]
    [root@master bin]# /opt/etcd/bin/etcdctl --ca-file=/opt/etcd/tsl/etcd-ca.pem --cert-file=/opt/etcd/tsl/etcd-server.pem --key-file=/opt/etcd/tsl/etcd-server-key.pem --endpoints="https://192.168.23.135:2379,https:/192.168.23.136:2379,https://192.168.23.137:2379" cluster-health
    member f605c94d9a81d1 is healthy: got healthy result from https://192.168.23.136:2379
    member 1d4ca791a3f37e9a is healthy: got healthy result from https://192.168.23.135:2379
    member 50da4142886026dc is healthy: got healthy result from https://192.168.23.137:2379
    cluster is healthy
    
    • 检查集群成员[任意节点]
    [root@master bin]# /opt/etcd/bin/etcdctl --ca-file=/opt/etcd/tsl/etcd-ca.pem --cert-file=/opt/etcd/tsl/etcd-server.pem --key-file=/opt/etcd/tsl/etcd-server-key.pem --endpoints="https://192.168.23.135:2379,https:/192.168.23.136:2379,https://192.168.23.137:2379" member list
    f605c94d9a81d1: name=etcd02 peerURLs=https://192.168.23.136:2380 clientURLs=https://192.168.23.136:2379 isLeader=false
    1d4ca791a3f37e9a: name=etcd01 peerURLs=https://192.168.23.135:2380 clientURLs=https://192.168.23.135:2379 isLeader=true
    50da4142886026dc: name=etcd03 peerURLs=https://192.168.23.137:2380 clientURLs=https://192.168.23.137:2379 isLeader=false
    

    5- 安装容器环境组件[master节点]

    5.1- 安装flanneld组件

    • 向 etcd 写入集群 Pod 网段信息

    pod网络规划为:172.10.0.0/16

    [root@master bin]# /opt/etcd/bin/etcdctl --ca-file=/opt/etcd/tsl/etcd-ca.pem --cert-file=/opt/etcd/tsl/etcd-server.pem --key-file=/opt/etcd/tsl/etcd-server-key.pem --endpoints="https://192.168.23.135:2379,https:/192.168.23.136:2379,https://192.168.23.137:2379" set /k8s-pod/network/config '{"Network":"172.10.0.0/16","Backend":{"Type":"vxlan"}}'
    {"Network":"172.10.0.0/16","Backend":{"Type":"vxlan"}}
    
    

    参数说明:写入的 Pod 网段 ${CLUSTER_CIDR} 必须是 /16 段地址,必须与 kube-controller-manager 的 --cluster-cidr 参数值一致;

    • 创建flannel配置二进制文件
    mkdir -p /opt/flanneld/{bin,config}
    
    cp /tmp/flannel-0.11/* /opt/flannel/bin/
    
    cd /opt/flanneld/bin
    
    
    [root@master bin]# ls
    flanneld  mk-docker-opts.sh
    
    • 创建flannel配置文件
    vim /opt/flanneld/config/flenneld.cfg
    
    FLANNEL_OPTIONS="-etcd-cafile=/opt/etcd/tsl/etcd-ca.pem 
    -etcd-certfile=/opt/etcd/tsl/etcd-server.pem 
    -etcd-keyfile=/opt/etcd/tsl/etcd-server-key.pem 
    -iface=ens33 
    -etcd-prefix=/k8s-pod/network 
    -etcd-endpoints=https://192.168.23.135:2379,https://192.168.23.136:2379,https://192.168.23.137:2379"
    
    
    • 创建flanneld 的 systemd unit 文件
    vim  /opt/flanneld/config/flanneld.service
    [Unit]
    Description=Flanneld overlay address etcd agent
    After=network-online.target network.target
    Before=docker.service
    
    [Service]
    Type=notify
    EnvironmentFile=/opt/flannel/config/flanneld.cfg
    ExecStart=/opt/flannel/bin/flanneld --ip-masq $FLANNEL_OPTIONS
    ExecStartPost=/opt/flannel/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    
    ln -s /opt/flannel/config/flanneld.service /usr/lib/systemd/system/flanneld.service
    

    写入的 Pod 网段 ${CLUSTER_CIDR} 必须是 /16 段地址,必须与 kube-controller-manager 的 --cluster-cidr 参数值一致;

    • 拷贝配置文件到各节点
    scp -r /opt/flannel/ root@192.168.23.136:/opt/   [master]
    scp -r /opt/flannel/ root@192.168.23.137:/opt/	 [master]
    ln -s /opt/flannel/config/flanneld.service /usr/lib/systemd/system/flanneld.service
    ln -s /opt/flannel/config/flanneld.service /usr/lib/systemd/system/flanneld.service
    
    • 启动flannel[所有几点]
    systemctl daemon-reload
    systemctl restart flanneld
    systemctl enable flanneld
    

    5.2- 安装docker-ce 18.03[master节点]

    • 下载二进制包
    mkdir -p /opt/docker/config/
    cp /tmp/docker-ce-18.03/docker* /usr/sbin/
    
    • 创建的 systemd unit 文件
    vim  /opt/docker/config/docker.service
    
    [Unit]
    Description=Docker Application Container Engine
    Documentation=https://docs.docker.com
    After=network-online.target firewalld.service
    Wants=network-online.target
    
    [Service]
    Type=notify
    EnvironmentFile=/run/flannel/subnet.env
    ExecStart=/usr/sbin/dockerd  $DOCKER_NETWORK_OPTIONS
    ExecReload=/bin/kill -s HUP $MAINPID
    LimitNOFILE=infinity
    LimitNPROC=infinity
    LimitCORE=infinity
    TimeoutStartSec=0
    Delegate=yes
    KillMode=process
    Restart=on-failure
    StartLimitBurst=3
    StartLimitInterval=60s
    
    [Install]
    WantedBy=multi-user.target
    
    
    • 配置docker参数
    cat > daemon.json <<EOF
    {
      "registry-mirrors": ["https://wbuj86p5.mirror.aliyuncs.com"],
      "exec-opts": ["native.cgroupdriver=systemd"]
    }
    EOF
    
    • 拷贝二进制和配置文件到其他节点
    scp  /usr/sbin/docker* root@192.168.23.136:/usr/sbin/
    scp  /usr/sbin/docker* root@192.168.23.137:/usr/sbin/
    
    scp -r /opt/docker/ root@192.168.23.136:/opt/
    scp -r /opt/docker/ root@192.168.23.137:/opt/
    
    • 启动docker服务[所有节点]
    mkdir -p /etc/docker/
    ln -s /opt/docker/config/daemon.json /etc/docker/daemon.json
    
    ln -s /opt/docker/config/docker.service /usr/lib/systemd/system/docker.service
    
    systemctl daemon-reload
    systemctl restart docker
    systemctl enable docker
    

    5.3- 检查验证flanneld和docker服务[所有节点]

    • flanneld
    [root@node-1 ~]# ifconfig flannel.1|grep inet
            inet 172.10.14.0  netmask 255.255.255.255  broadcast 0.0.0.0
    
    • docker网桥
    [root@node-1 ~]# ifconfig docker0|grep inet
            inet 172.10.14.1  netmask 255.255.255.0  broadcast 172.10.14.255
    
    • docker info
    [root@node-1 ~]# docker info|egrep 'Cgroup|Network'
    Cgroup Driver: systemd
     Network: bridge host macvlan null overlay
    

    至此所有非k8s的组件环境安装完成!

    检查所有服务必须正常

    • node-1
    [root@node-1 ~]# systemctl status etcd flanneld docker|grep running
       Active: active (running) since Thu 2020-07-23 15:54:10 CST; 7min ago
       Active: active (running) since Thu 2020-07-23 15:54:10 CST; 7min ago
       Active: active (running) since Thu 2020-07-23 15:54:11 CST; 7min ago
    
    • node-2
    [root@master ~]# systemctl status etcd flanneld docker|grep running
       Active: active (running) since Thu 2020-07-23 15:54:08 CST; 8min ago
       Active: active (running) since Thu 2020-07-23 15:54:08 CST; 8min ago
       Active: active (running) since Thu 2020-07-23 15:54:09 CST; 8min ago
    
    • master
    [root@node-2 ~]# systemctl status etcd flanneld docker|grep running
       Active: active (running) since Thu 2020-07-23 15:54:08 CST; 8min ago
       Active: active (running) since Thu 2020-07-23 15:54:08 CST; 8min ago
       Active: active (running) since Thu 2020-07-23 15:54:09 CST; 8min ago
    

    6- 安装master节点组件[master]

    kubernetes master 节点运行如下组件:
    kube-apiserver
    kube-scheduler
    kube-controller-manager
    kube-scheduler 和 kube-controller-manager 可以以集群模式运行,通过 leader 选举产生一个工作进程,其它进程处于阻塞模式。

    6.1- 安装 kube-apiserver 组件

    • 创建 TLS Bootstrapping Token
    cd /opt/k8s/config/
    
    [root@master config]# head -c 16 /dev/urandom | od -An -t x | tr -d ' '
    2c1e270afcd5440611fd76ee3faab593
    
    vim k8s-token.csv
    
    2c1e270afcd5440611fd76ee3faab593,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
    
    • 创建apiserver配置文件
    vim kube-apiserver.cfg
    KUBE_APISERVER_OPTS="--logtostderr=true 
    --v=4 
    --etcd-servers=https://192.168.23.135:2379,https://192.168.23.136:2379,https://192.168.23.137:2379 
    --bind-address=192.168.23.135 
    --secure-port=6443 
    --advertise-address=192.168.23.135 
    --allow-privileged=true 
    --service-cluster-ip-range=10.0.0.0/24 
    --enable-admission-plugins=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota,NodeRestriction 
    --authorization-mode=RBAC,Node 
    --enable-bootstrap-token-auth 
    --token-auth-file=/opt/k8s/config/k8s-token.csv 
    --service-node-port-range=30000-50000 
    --tls-cert-file=/opt/k8s/tsl/k8s-apiserver.pem  
    --tls-private-key-file=/opt/k8s/tsl/k8s-apiserver-key.pem 
    --client-ca-file=/opt/k8s/tsl/k8s-ca.pem 
    --service-account-key-file=/opt/k8s/tsl/k8s-ca-key.pem 
    --etcd-cafile=/opt/etcd/tsl/etcd-ca.pem 
    --etcd-certfile=/opt/etcd/tsl/etcd-server.pem 
    --etcd-keyfile=/opt/etcd/tsl/etcd-server-key.pem"
    
    • 创建 kube-apiserver systemd unit 文件
    vim kube-apiserver.service
    [Unit]
    Description=Kubernetes API Server
    Documentation=https://github.com/kubernetes/kubernetes
    
    [Service]
    EnvironmentFile=/opt/k8s/config/kube-apiserver.cfg
    ExecStart=/opt/k8s/bin/kube-apiserver $KUBE_APISERVER_OPTS
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    
    • 拷贝二进制文件
    cp /tmp/kubernetes-v.1.18.5/kube-apiserver /opt/k8s/bin/
    
    • 启动服务
    ln -s /opt/k8s/config/kube-apiserver.service /usr/lib/systemd/system/kube-apiserver.service
    
    systemctl daemon-reload
    systemctl enable kube-apiserver
    systemctl restart kube-apiserver
    
    • 检查服务运行情况

    ps: 如果出现错误则先处理错误后在部署下一个组件。

    [root@master config]# systemctl status kube-apiserver
    ● kube-apiserver.service - Kubernetes API Server
       Loaded: loaded (/opt/k8s/config/kube-apiserver.service; enabled; vendor preset: disabled)
       Active: active (running) since Thu 2020-07-23 17:07:25 CST; 5min ago
         Docs: https://github.com/kubernetes/kubernetes
     Main PID: 4911 (kube-apiserver)
       CGroup: /system.slice/kube-apiserver.service
               └─4911 /opt/k8s/bin/kube-apiserver --logtostderr=true --v=4 --etcd-servers=https://192.168.23.135:2379,https://192.168.23.136:2379,https://192.168.23.137:2379 --bind-addre...
    

    6.2- 部署kube-scheduler

    • 创建kube-scheduler配置文件
    vim kube-scheduler.cfg
    KUBE_SCHEDULER_OPTS="--logtostderr=true --v=4 --master=127.0.0.1:8080 --leader-elect"
    

    --address:在 127.0.0.1:10251 端口接收 http /metrics 请求;kube-scheduler 目前还不支持接收 https 请求;

    • 创建kube-scheduler systemd unit 文件
    vim kube-scheduler.service
    [Unit]
    Description=Kubernetes Scheduler
    Documentation=https://github.com/kubernetes/kubernetes
    
    [Service]
    EnvironmentFile=/opt/k8s/config/kube-scheduler.cfg
    ExecStart=/opt/k8s/bin/kube-scheduler $KUBE_SCHEDULER_OPTS
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    
    • 拷贝二进制文件
    cp /tmp/kubernetes-v.1.18.5/kube-scheduler /opt/k8s/bin/
    
    • 启动服务
    ln -s /opt/k8s/config/kube-scheduler.service /usr/lib/systemd/system/kube-scheduler.service
    
    systemctl daemon-reload
    systemctl start kube-scheduler
    systemctl enable kube-scheduler
    
    • 检查服务
    [root@master config]# systemctl status kube-scheduler
    ● kube-scheduler.service - Kubernetes Scheduler
       Loaded: loaded (/opt/k8s/config/kube-scheduler.service; enabled; vendor preset: disabled)
       Active: active (running) since Thu 2020-07-23 17:21:01 CST; 32s ago
         Docs: https://github.com/kubernetes/kubernetes
     Main PID: 6008 (kube-scheduler)
       CGroup: /system.slice/kube-scheduler.service
               └─6008 /opt/k8s/bin/kube-scheduler --logtostderr=true --v=4 --master=127.0.0.1:8080 --leader-elect
    

    6.3- 安装kube-controller-manager

    • 创建kube-controller-manager配置文件
    vim kube-controller-manager.cfg
    
    KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=true 
    --v=4 
    --master=127.0.0.1:8080 
    --leader-elect=true 
    --address=127.0.0.1 
    --service-cluster-ip-range=10.0.0.0/24 
    --cluster-name=kubernetes 
    --cluster-signing-cert-file=/opt/k8s/tsl/k8s-ca.pem 
    --cluster-signing-key-file=/opt/k8s/tsl/k8s-ca-key.pem  
    --root-ca-file=/opt/k8s/tsl/k8s-ca.pem 
    --service-account-private-key-file=/opt/k8s/tsl/k8s-ca-key.pem"
    
    • 创建systemd unit 文件
    vim kube-controller-manager.service
    
    [Unit]
    Description=Kubernetes Controller Manager
    Documentation=https://github.com/kubernetes/kubernetes
    
    [Service]
    EnvironmentFile=/opt/k8s/config/kube-controller-manager.cfg
    ExecStart=/opt/k8s/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_OPTS
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    
    • 拷贝二进制文件
    cp /tmp/kubernetes-v.1.18.5/kube-controller-manager /opt/k8s/bin/
    
    • 启动服务
    ln -s /opt/k8s/config/kube-controller-manager.service /usr/lib/systemd/system/kube-controller-manager.service
    
    systemctl daemon-reload
    systemctl start kube-controller-manager
    systemctl enable kube-controller-manager
    
    • 检查服务
    [root@master config]# systemctl status kube-controller-manager
    ● kube-controller-manager.service - Kubernetes Controller Manager
       Loaded: loaded (/opt/k8s/config/kube-controller-manager.service; enabled; vendor preset: disabled)
       Active: active (running) since Thu 2020-07-23 17:45:16 CST; 30s ago
         Docs: https://github.com/kubernetes/kubernetes
     Main PID: 7891 (kube-controller)
       CGroup: /system.slice/kube-controller-manager.service
               └─7891 /opt/k8s/bin/kube-controller-manager --logtostderr=true --v=4 --master=127.0.0.1:8080 --leader-elect=true --address=127.0...
    

    6.4- 检查集群状态

    cp /tmp/kubernetes-v.1.18.5/kubectl /usr/sbin/
    
    [root@master config]# kubectl get cs
    NAME                 STATUS    MESSAGE             ERROR
    scheduler            Healthy   ok
    controller-manager   Healthy   ok
    etcd-2               Healthy   {"health":"true"}
    etcd-0               Healthy   {"health":"true"}
    etcd-1               Healthy   {"health":"true"}
    

    ps: master节点组件部署完成,此时建议多次重启系统检查服务是否正常,否则需要检查修复后再部署node节点组件。


    7- 安装node节点组件

    kubernetes node 节点运行如下组件:
    kubelet
    kube-proxy

    7.1- 部署 kubelet 组件

    • kublet 运行在每个 worker 节点上,接收 kube-apiserver 发送的请求,管理 Pod 容器,执行交互式命令,如exec、run、logs 等;

    • kublet 启动时自动向 kube-apiserver 注册节点信息,内置的 cadvisor 统计和监控节点的资源使用情况;

    • 为确保安全,只开启接收 https 请求的安全端口,对请求进行认证和授权,拒绝未授权的访问(如apiserver、heapster)。

    7.1.1- 创建 kubelet bootstrap.kubeconfig 文件[master节点]

    • 设置变量
    mkdir -p /opt/k8s-node/{bin,tsl,config}
    cd /opt/k8s-node/config/
    
    export BOOTSTRAP_TOKEN=2c1e270afcd5440611fd76ee3faab593
    export KUBE_APISERVER="https://192.168.23.135:6443"
    
    • 设置集群参数
    kubectl config set-cluster kubernetes 
    --certificate-authority=/opt/k8s/tsl/k8s-ca.pem 
    --embed-certs=true 
    --server=${KUBE_APISERVER} 
    --kubeconfig=./bootstrap.kubeconfig
    
    • 设置客户端认证参数
    kubectl config set-credentials kubelet-bootstrap 
    --token=${BOOTSTRAP_TOKEN} 
    --kubeconfig=./bootstrap.kubeconfig
    
    • 设置上下文参数
    kubectl config set-context default 
    --cluster=kubernetes 
    --user=kubelet-bootstrap 
    --kubeconfig=./bootstrap.kubeconfig
    
    • 使用上下文参数
    kubectl config use-context default --kubeconfig=./bootstrap.kubeconfig
    

    7.1.2- 创建 kubelet.kubeconfig 文件

    • 设置集群参数
    kubectl config set-cluster kubernetes 
    --certificate-authority=/opt/k8s/tsl/k8s-ca.pem 
    --embed-certs=true --server=${KUBE_APISERVER}  
    --kubeconfig=./kubelet.kubeconfig
    
    • 设置客户端认证参数
    kubectl config set-credentials kubelet 
    --token=${BOOTSTRAP_TOKEN} 
    --kubeconfig=./kubelet.kubeconfig
    
    • 设置上下文参数
    kubectl config set-context default 
    --cluster=kubernetes 
    --user=kubelet 
    --kubeconfig=./kubelet.kubeconfig
    
    • 使用上下文参数
    kubectl config use-context default --kubeconfig=./kubelet.kubeconfig
    

    7.1.3 安装kubelet进程组件

    • 创建kubelet.env 参数配置文件
    cd /opt/k8s-node/config
    vim kubelet.env
    
    kind: KubeletConfiguration
    apiVersion: kubelet.config.k8s.io/v1beta1
    address: 192.168.23.136
    port: 10250
    readOnlyPort: 10255
    cgroupDriver: systemd        
    clusterDomain: k8s.local.
    failSwapOn: false
    authentication:
      anonymous:
        enabled: true
    

    PS: cgroupDriver 类型必须与docker设置的一样,否则会导致approve后kubele会进程推出

    • 创建kubelet.cfg服务配置文件
    vim kubelet.cfg
    KUBELET_OPTS="--logtostderr=true 
    --v=4 
    --hostname-override=node-1 
    --kubeconfig=/opt/k8s-node/config/kubelet.kubeconfig 
    --bootstrap-kubeconfig=/opt/k8s-node/config/bootstrap.kubeconfig 
    --config=/opt/k8s-node/config/kubelet.env 
    --cert-dir=/opt/k8s-node/tsl/ 
    --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"
    
    • 创建kubelet systemd unit 文件
    vim kubelet.service
    [Unit]
    Description=Kubernetes Kubelet
    Requires=docker.service
    After=docker.service
    
    
    [Service]
    EnvironmentFile=/opt/k8s-node/config/kubelet.cfg
    ExecStart=/opt/k8s-node/bin/kubelet $KUBELET_OPTS
    Restart=on-failure
    KillMode=process
    
    [Install]
    WantedBy=multi-user.target
    
    • 将kubelet-bootstrap用户绑定到系统集群角色
    kubectl create clusterrolebinding kubelet-bootstrap 
      --clusterrole=system:node-bootstrapper 
      --user=kubelet-bootstrap
    
    • 拷贝二进制文件
    cp /tmp/kubernetes-v.1.18.5/kubelet /opt/k8s-node/bin/kube
    
    • 拷贝配置文件到node节点
    scp -r /opt/k8s-node/ root@192.168.23.136:/opt/
    scp -r /opt/k8s-node/ root@192.168.23.137:/opt/
    
    • 启动服务[node节点]
    ln -s /opt/k8s-node/config/kubelet.service /usr/lib/systemd/system/kubelet.service
    
    systemctl daemon-reload
    systemctl start kubelet
    systemctl enable kubelet
    

    7.1.4- approve kubelet CSR 请求[master节点]

    • 查看获取到到请求
    [root@master config]# kubectl get csr
    NAME                                                   AGE     SIGNERNAME                                    REQUESTOR           CONDITION
    node-csr-OcSB30Vo3Gge_tX3OM5uuINwkkCYgzaW0y5FcVZGiRI   2m20s   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Pending
    node-csr-bG5qkwBn7kllVT_E21pV-gDZ35hlEvy6q_16PWXSr00   64s     kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Pending
    
    • approve请求
    kubectl certificate approve node-csr-OcSB30Vo3Gge_tX3OM5uuINwkkCYgzaW0y5FcVZGiRI
    kubectl certificate approve node-csr-bG5qkwBn7kllVT_E21pV-gDZ35hlEvy6q_16PWXSr00
    
    • 查看approve后的结果
    [root@master config]# kubectl get csr
    NAME                                                   AGE     SIGNERNAME                                    REQUESTOR           CONDITION
    node-csr-OcSB30Vo3Gge_tX3OM5uuINwkkCYgzaW0y5FcVZGiRI   4m41s   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Approved,Issued
    node-csr-bG5qkwBn7kllVT_E21pV-gDZ35hlEvy6q_16PWXSr00   3m25s   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Approved,Issued
    
    
    • csr 状态变为 Approved,Issued 即可
    • Requesting User:请求 CSR 的用户,kube-apiserver 对它进行认证和授权;
    • Subject:请求签名的证书信息;
    • 证书的 CN 是 system:node:kube-node2, Organization 是 system:nodes,kube-apiserver 的 Node 授权模式会授予该证书的相关权限;
    • 查看服务状态
    [root@master ~]# kubectl get node,cs
    NAME          STATUS   ROLES    AGE   VERSION
    node/node-1   Ready    <none>   40m   v1.18.5
    node/node-2   Ready    <none>   42m   v1.18.5
    
    NAME                                 STATUS    MESSAGE             ERROR
    componentstatus/controller-manager   Healthy   ok
    componentstatus/scheduler            Healthy   ok
    componentstatus/etcd-2               Healthy   {"health":"true"}
    componentstatus/etcd-1               Healthy   {"health":"true"}
    componentstatus/etcd-0               Healthy   {"health":"true"}
    
    

    7.2- 安装kube-proxy组件

    kube-proxy 运行在所有 node节点上,它监听 apiserver 中 service 和 Endpoint 的变化情况,创建路由规则来进行服务负载均衡。

    7.2.1- 创建kube-proxy kubeconfig文件[master]

    • 设置集群参数
    cd /opt/k8s-node/config/
    export BOOTSTRAP_TOKEN=2c1e270afcd5440611fd76ee3faab593
    export KUBE_APISERVER="https://192.168.23.135:6443"
    
    kubectl config set-cluster kubernetes 
    --certificate-authority=/opt/k8s/tsl/k8s-ca.pem 
    --embed-certs=true 
    --server=${KUBE_APISERVER} 
    --kubeconfig=./kube-proxy.kubeconfig
    
    • 设置客户端认证参数
    kubectl config set-credentials kube-proxy 
    --client-certificate=/opt/k8s/tsl/k8s-proxy.pem 
    --client-key=/opt/k8s/tsl/k8s-proxy-key.pem 
    --embed-certs=true 
    --kubeconfig=./kube-proxy.kubeconfig
    
    • 设置上下文参数
    kubectl config set-context default 
    --cluster=kubernetes 
    --user=kube-proxy 
    --kubeconfig=./kube-proxy.kubeconfig
    
    • 使用上下文
    kubectl config use-context default --kubeconfig=./kube-proxy.kubeconfig
    

    7.2.2- 创建配置文件

    • 创建kube-proxy配置文件
    vim kube-proxy.cfg
    KUBE_PROXY_OPTS="--logtostderr=true 
    --v=4 
    --hostname-override=node-1 
    --cluster-cidr=10.0.0.0/24 
    --kubeconfig=/opt/k8s-node/config/kube-proxy.kubeconfig"
    

    --cluster-cidr=10.0.0.0/24 集群service网络

    • 创建kube-proxy systemd unit 文件
    vim kube-proxy.service
    [Unit]
    Description=Kubernetes Proxy
    After=network.target
    
    [Service]
    EnvironmentFile=/opt/k8s-node/config/kube-proxy.cfg
    ExecStart=/opt/k8s-node/bin/kube-proxy $KUBE_PROXY_OPTS
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    

    7.2.3- 启动服务

    • 拷贝二进制文件
    cp /tmp/kubernetes-v.1.18.5/kube-proxy /opt/k8s-node/bin/
    
    • 拷贝配置文件到node节点
    scp /opt/k8s-node/bin/kube-proxy root@192.168.23.136:/opt/k8s-node/bin/
    scp /opt/k8s-node/bin/kube-proxy root@192.168.23.137:/opt/k8s-node/bin/
    
    scp /opt/k8s-node/config/kube-proxy.* root@192.168.23.136:/opt/k8s-node/config/
    scp /opt/k8s-node/config/kube-proxy.* root@192.168.23.137:/opt/k8s-node/config/
    
    • 启动进程
    ln -s /opt/k8s-node/config/kube-proxy.service /usr/lib/systemd/system/kube-proxy.service
    
    systemctl daemon-reload
    systemctl enable kube-proxy
    systemctl restart kube-proxy
    

    7.2.4- 检查服务状态

    • master
    [root@master config]# systemctl status kube-proxy
    ● kube-proxy.service - Kubernetes Proxy
       Loaded: loaded (/opt/k8s-node/config/kube-proxy.service; disabled; vendor preset: disabled)
       Active: active (running) since Fri 2020-07-24 07:16:43 CST; 1min 31s ago
    
    • node-1
    Hint: Some lines were ellipsized, use -l to show in full.
    [root@node-1 k8s-node]# systemctl status kube-proxy
    ● kube-proxy.service - Kubernetes Proxy
       Loaded: loaded (/opt/k8s-node/config/kube-proxy.service; enabled; vendor preset: disabled)
       Active: active (running) since Fri 2020-07-24 06:18:44 CST; 58min ago
     Main PID: 32609 (kube-proxy)
    
    • node-2
    [root@node-2 ~]# systemctl status kube-proxy
    ● kube-proxy.service - Kubernetes Proxy
       Loaded: loaded (/opt/k8s-node/config/kube-proxy.service; enabled; vendor preset: disabled)
       Active: active (running) since Fri 2020-07-24 06:21:04 CST; 55min ago
     Main PID: 32682 (kube-proxy)
        Tasks: 7
       Memory: 16.5M
       CGroup: /system.slice/kube-proxy.service
    

    ps:此时K8S集群部署完成,建议多次重启服务器验证集群服务情况

  • 相关阅读:
    C++中的乱七八糟问题
    在Win环境下配置java的环境进行开发步骤
    常用软件破解
    关于QT建立项目中遇到的相关问题的处理办法
    QT5.4.0安装以及与VS2010整合安装---64bit操作系统解决方案
    STL容器之一vector
    STL
    三种初步简易的方法求解数值问题 of C++
    Visual Studio 简单使用常识操作
    江城感怀---诗一首
  • 原文地址:https://www.cnblogs.com/lemanlai/p/13376441.html
Copyright © 2011-2022 走看看