kubeadm是官方提供的安装工具,自1.18.5以来,用它来安装非常简单。但官方的指导文档主要是基于单机版的,这里记录下集群版安装思路。

一、 集群规划

ETCD节点与Master节点在同一台主机上。在云上,因为不能自建Keepalived+LVS实现虚拟IP。所以为了高可用,需要借助云平台的负载均衡产品,但好在现在一般云平台的负载均衡内网流量都不收费。

架构示意图:

1
2
3
4
5
            Master1
    slb-----Master2
            Master3

# K8S控制节点的API地址指向SLB,在SLB上代理后端三台控制节点

二、 安装

  1. 前期准备

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    # 设置K8S Repo源
    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    
    # 安装Docker-ce源
    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    # 安装相关包,建议指定包版本,不然默认会使用最新稳定版-1
    yum install docker-ce kubeadm-1.18.5 kubectl-1.18.5 kubelet-1.18.5 -y
    
    # 启动Dokcer
    systemctl enable docker && systemctl start docker
    
    
    # 增加docker参数文件
     cat << EOF > /etc/docker/daemon.json
     {
         "exec-opts": ["native.cgroupdriver=systemd"],
         "live-restore": true,
         "registry-mirrors": ["https://o9a5ub50.mirror.aliyuncs.com"],
         "log-opts": {
             "max-file": "3",
             "max-size": "10m"
         },
         "insecure-registries": ["docker.hub.com:80"],
         "add-registry": ["docker.hub.com:80"],
         "data-root": "/docker"
     }
     EOF
    
    
    # 重启docker并将kubelet设置为开机自启动
    systemctl restart docker && systemctl enable kubelet
    
  2. 初始化第一个控制节点

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
    # 第一台控制节点
    # 10.0.0.100是内部负载均衡的IP地址
    # 加上--dry-run不实际执行, -v=5输出更详细的信息
    # --servcie-cidr与--pod-network-cidr不要和主机网络重叠了
    kubeadm init    --control-plane-endpoint "10.0.0.100:6443" \
                    --kubernetes-version "1.18.5" \
                    --v=5 \
                    --image-repository "hub.docker.local:5000" > out.txt
    # registry.aliyuncs.com/google_containers 公网阿里可用
    
    # kubeadm config images list --kubernetes-version 1.18.5
    # 获取镜像与Tag后先pull下来,打上内网地址并推送至内部仓库,这样不用每台都从外网下,加快速度
    

    以上执行完成后,第一个节点已好,此时只有一个ETCDPod运行,待后续控制节点加入后,ETCD将以集群方式运行,这个转换步骤将由kubeadm自动完成。

    建议同时修改kube-proxy的模式,将默认的iptables转为ipvs模式

    1
    2
    3
    4
    5
    6
    7
    
    mkdir .kube
    cp /etc/kubernetes/admin.conf .kube/config
    kubect edit cm/kube-proxy -n kube-system
    
    ...
    mode: "ipvs"
    ...
    

    以上修改只是修改了kube-proxy的配置文件,后续修改DaemonSet,让kube-proxy重新生成新的,读取配置

    1
    2
    
    # 随便更新些东西,让原来的Pod重新生成即可
    kubectl edit ds/kube-proxy -n kube-system
    

    验证是否在IPVS模式下

    1
    2
    
    yum install ipvsadm -y
    ipvsadm -ln
    
  3. SSL证书分发到待加入的控制节点

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    # 1.先在待加入节点创建后pki目录
    mkdir -p /etc/kubernetes/pki/etcd
    
    # 2. 在第一台控制节点上,将证书复制到待加入的控制节点。其他证书不要复用,kubeadm会自动创建
    scp /etc/kubernetes/pki/ca.*  root@10.0.0.102:/etc/kubernetes/pki
    scp /etc/kubernetes/pki/sa.*  root@10.0.0.102:/etc/kubernetes/pki
    scp /etc/kubernetes/pki/front*  root@10.0.0.102:/etc/kubernetes/pki
    scp /etc/kubernetes/pki/etcd/ca.*  root@10.0.0.102:/etc/kubernetes/pki/etcd
    
    # 另外一台复制也一样,此处略...
    
  4. 加入另外的控制节点

    1
    2
    3
    4
    
    # 在第一台控制节点中的out.txt文件中,有加入控制节点与工作节点的命令,复制在新控制节点上运行即可
    kubeadm join 10.0.0.100:6443 --token 6t2uid.s0vqohvf976nnib8 \
    --discovery-token-ca-cert-hash sha256:9314daf259b95b133a254fd0a8dc41887bc99055c5dfd082a8d41591b18cc98b \
    --control-plane
    
  5. 创建网络与测试验证

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    # 在第一台控制节点上执行,安装网络组件
    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=v1.18.5"
    
    # 验证etcd三个节点都是正常运行,不在本机的coredns Pod的IP在本机可以PING通
    kubectl get nodes --all-namespaces -o wide
    kubectl get pods -n kube-system |grep etcd
    
    #  Worker节点打上node标签,这样kubectl get nodes ROLES一项就不为None
    kubectl label node NodeName node-role.kubernetes.io/node=
    

三、 后续组件安装

  1. 添加Kubernetes Dashboard组件

    1
    
    wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
    

    修改recommended.yaml:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    # 修改service暴露出来,约40行
    ...
    spec:
      externalIPs:
      - 10.0.0.101 #集群内任意一台主机的内网IP
      ports:
        - port: 9443 #修改暴露出来的端口
    ...
    # 修改集群角色
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
    name: kubernetes-dashboard
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    # 约164行,修改ClusterRoleBinding,将默认的用户修改为admin
    # name: kubernetes-dashboard
    name: admin
    subjects:
    - kind: ServiceAccount
        name: kubernetes-dashboard
        namespace: kubernetes-dashboard
    

    获取Kubernetes DashboardToken

    1
    2
    3
    
     # 获取返回的Token字段即可
    token=$(kubectl get secret -n kubernetes-dashboard |grep kubernetes-dashboard-token | awk '{print $1}')
    kubectl describe secret ${token} -n kubernetes-dashboard
    
  2. 添加Metric Server组件

    1
    
    wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml
    

    修改components.yaml:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
    ...
    args:
    # 添加
    - /metrics-server
    - --metric-resolution=30s
    - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
    - --kubelet-insecure-tls
    # 添加以上内容
    - --cert-dir=/tmp
    - --secure-port=4443
    ...
    # 约109行,添加污点容忍,将Pod部署在Master节点上
    # 同nodeSelector对齐
    tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
    
  3. 更新证书,可以写入crontab默认的证书有效期为1年,CA证书10年,下面的命令不能更新CA证书

    1
    2
    3
    4
    5
    
    # 查看当前证书有效期
    kubeadm alpha certs check-expiration
    
    # 更新所有证书
    kubeadm alpha certs renew all