天天看點

centos系統 用kubeadm 搭建高可用k8s叢集

官網教程(部分國外鏡像源下載下傳會逾時)

1. 安裝前調整系統配置

  • 主機規劃
    主節點1   hostnamectl set-hostname k8s-master01 && bash
    主節點2   hostnamectl set-hostname k8s-master02 && bash
    工作節點1 hostnamectl set-hostname k8s-node01 && bash
    
    # 所有節點的/etc/hosts都要添加,查了下阿裡雲和騰訊雲目前都不支援vip。
    # 騰訊雲vpc環境通過keeplived生成的vip, 其他伺服器無法通路,且外網無法通路。
    # 是以把vip配置成節點k8s-master01的外網ip,其它都為内網ip   
    cat >> /etc/hosts <<EOF
    vip www.k8s.com  
    master01_ip k8s-master01
    master02_ip k8s-master02
    node01_ip k8s-node01
    EOF
               
  • 啟用橋接防火牆(透明網橋)功能(所有節點都要執行)
    ### (CentOS7/Redhat7/Fedora)主機重新開機會自動加載/etc/modules-load.d 目錄下配置檔案裡配置的module
    cat >/etc/modules-load.d/k8s.conf <<EOF
    br_netfilter
    EOF
    或者
    # modprobe br_netfilter  ### 主機重新開機會失效 
    
               
  • 配置核心參數
    cat <<EOF >  /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_nonlocal_bind = 1
    net.ipv4.ip_forward = 1
    vm.swappiness=0
    EOF
    
    sysctl --system
               
  • selinux 和 swap操作
    ### 檢視selinux 和 swap(所有節點都要操作)
    cat /etc/selinux/config
    cat /proc/swaps
    
    ### 禁用 selinux 和 swap
    setenforce 0
    swapoff -a
               
  • 啟用ipvs子產品(推薦kube-proxy使用ipvs)
    # 檢視ipvs子產品是否啟用
    lsmod | grep ip_vs
    
    # 如果未啟用,啟用ipvs
    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
    
    chmod +x /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules
               

2. 安裝docker及k8s元件

  • docker安裝教程
  • 配置docker驅動為systemd(所有節點都要執行)
    cat >/etc/docker/daemon.json <<EOF
    {"exec-opts":["native.cgroupdriver=systemd"],"registry-mirrors":["https://docker.mirrors.ustc.edu.cn/"]}
    EOF
    
    systemctl reload daemon
    systemctl restart docker
               

    native.cgroupdriver: docker 驅動(docker 預設的是cgroupfs, kubelet預設的是systemd, 改docker配置和kubelet配置都行,否則叢集起不來。

    改kubelet配置相對比較麻煩,kubelet配置檔案是在kubeadm init的時候生成的,需要在kubeadm init /  kubeadm john後修改然後重新開機kubelet)       

    registry-mirrors: 鏡像源

  • 建立yum源(谷歌源通路不了,這裡換成阿裡的了)(所有節點都要執行)
    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
               
  • 安裝kubelet,kubeadm,kubectl(所有節點都要執行,工作節點不用安裝kubectl)
    yum install -y kubelet kubeadm kubectl
               

    kubeadm: the command to bootstrap the cluster

    kubelet:    the component that runs on all of the machines in your cluster and does things like starting pods and containers.

    kubectl:    the command line util to talk to your cluster(api server).

  • 設定kubelet開機自啟動(這裡如果啟動的話會因為沒有kubelet-config配置檔案報錯,kubeadm init 和 kubeadm john 過程中會生成kubelet配置檔案及啟動kubelet)
    systemctl enable kubelet
               

3.  部署keepalived和haproxy 

  • 參考 高可用_keepalived + haproxy

4. 初始化叢集

  • 擷取叢集預設啟動配置并修改(主節點執行)
    kubeadm  config  print init-defaults > kubeadm.yaml
    
    vim kubeadm.yaml 内容如下:
    
    apiVersion: kubeadm.k8s.io/v1beta2
    bootstrapTokens:
    - groups:
      - system:bootstrappers:kubeadm:default-node-token
      token: abcdef.0123456789abcdef
      ttl: 24h0m0s
      usages:
      - signing
      - authentication
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: 172.17.0.8
      bindPort: 6443
    nodeRegistration:
      criSocket: /var/run/dockershim.sock
      name: k8s-master01
      taints:
      - effect: NoSchedule
        key: node-role.kubernetes.io/master
    ---
    apiServer:
      timeoutForControlPlane: 4m0s
      CertSANs:
        - vip
        - "www.k8s.com"
    apiVersion: kubeadm.k8s.io/v1beta2
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controlPlaneEndpoint: "www.k8s.com:8443"
    controllerManager: {}
    dns:
      type: CoreDNS
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: registry.aliyuncs.com/google_containers
    kind: ClusterConfiguration
    kubernetesVersion: v1.20.4
    networking:
      dnsDomain: cluster.local
      serviceSubnet: 10.96.0.0/12
      podSubnet: 10.244.0.0/16
    scheduler: {}
               
  • 啟動叢集
    kubeadm init --config ./kubeadm.yaml --upload-certs | tee init.log
    (ERROR FileContent--proc-sys-net-ipv4-ip_forward: echo 1 > /proc/sys/net/ipv4/ip_forward)
    
    #如果配置有問題,可以重置,然後重新啟動叢集,節點重新加入叢集前也需要reset。否則無法加入叢集
    kubeadm reset && kubeadm init --config ./kubeadm.yaml --upload-certs | tee init.log
               

    advertiseAddress配置成公網,在init的過程中需要調整etcd配置(每次init都會重新生成etcd配置檔案,是以需要在init過程中修改。提前打開兩個視窗) 

    --upload-certs : 初始化的過程會把證書檔案分發到其他主機節點。 

    視窗1執行 init

    centos系統 用kubeadm 搭建高可用k8s叢集
    視窗2 修改etcd配置
    vim /etc/kubernetes/manifests/etcd.yaml
               
    centos系統 用kubeadm 搭建高可用k8s叢集

    --listen-client-urls=https://0.0.0.0:2379

    --listen-peer-urls=https://0.0.0.0:2380

    回到視窗1等待啟動完成,注意啟動完成後的提示資訊,如果日志被刷了,可以檢視檔案init.log

  • 通過把授權資訊拷貝到$HOME/.kube目錄下,使目前使用者有權限操作叢集(這個授權資訊也是lens需要的);
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
               
  • 檢視叢集資訊
    # 檢視叢集配置資訊
    kubectl -n kube-system get cm kubeadm-config -o yaml
    
    # 檢視節點資訊
    kubectl get nodes --show-labels
    
    # 檢視pod資訊
    kubectl get pods -A
    
    # 更多元件資訊檢視
    kubectl get --help
               
    因為還沒有裝網絡插件。coredns相關pod狀态是unready(0)
  • 節點taint(污點)資訊處理
    # 檢視節點污點
    kubectl describe nodes k8s-master | grep Tain
    
    # 有taint的節點隻能作為master節點,不能作為worker節點。
    # 如果要在有污點的節點上部署服務需要,待部署服務的配置檔案需要顯示的配置容忍污點
    tolerations:(與containers同一層)
          - key: "node-role.kubernetes.io/master"
            operator: "Equal"
            value: ""
            effect: "NoSchedule"
    
    ### 添加污點
    kubectl taint node k8s-master01 key=test
    ### 删除污點
    kubectl taint node k8s-master01 key-
               

4. 安裝網絡插件

  • 下載下傳并配置flannel config檔案
    # 解決raw.githubusercontent.com被屏蔽的問題
    vim /etc/hosts
    添加
    199.232.68.133 raw.githubusercontent.com
    
    # 下載下傳flannel部署檔案(預設flannel鏡像被屏蔽掉了,需要修改下)
    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
    vim kube-flannel.yml
    
    # 找到 image (有兩處) 
    # 替換為 jmgao1983/flannel  (通過 docker search flannel 找到的,也可以替換成你想要的其他鏡像)
    image: jmgao1983/flannel
               
  • 部署 flannel
    kubectl apply -f ./kube-flannel.yml
               
    flanneld 是一個 daemonset 下發到每個節點的 pod,它的作用是搭建網絡(幹道),而 flannel cni 是節點建立的時候,通過 kubernetes-cni 這個 rpm 包安裝的 cni 插件,其被 kubelet 調用,用來為具體的 pod 建立網絡(分枝)。了解這兩者的差別,有助于我們了解 flanneld 和 flannel cni 相關的配置檔案的用途。比如 /run/flannel/subnet.env,是 flanneld 建立的,為 flannel cni 提供輸入的一個環境變量檔案;又比如 /etc/cni/net.d/10-flannel.conf,也是 flanneld pod(準确的說,是 pod 裡的腳本 install-cni)從 pod 裡拷貝到節點目錄,給 flannel cni 使用的子網配置檔案 --- 這段是引用K8s 從懵圈到熟練 – 叢集網絡詳解 便于了解flannel。

5. 向叢集中添加節點

  • 前提條件:待加入節點主機及/etc/hosts已配置,docker已安裝配置,網絡已設定,selinux和swap已禁用,kubeadm/kubelet/kubectl已安裝
  • 主節點k8s-master02加入叢集

    登入主節點k8s-master02

    # k8s-master01 初始叢集後的日志裡有 advertiseAddress需要替換為配置的ip
    # 本人是在公網ip搭的環境不便暴露
    kubeadm join advertiseAddress:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:61e933bd8722ede6eac2b12e02a0527ac4566469344dd74564aaeadc22222ff4 \
        --control-plane --certificate-key 5bef349c1fdc0c54c414cba1982d95d5bbc524a825dce8a98e0c6080d44f347f
    
    # 如果token過期,可以生成一個新的token
    kubeadm token create
    
    # 檢視token清單
    kubeadm token list
               
  • 工作節點k8s-node01,k8s-node02加入叢集

    分别登入k8s-node01,k8s-node02

    kubeadm join 175.24.121.139:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:61e933bd8722ede6eac2b12e02a0527ac4566469344dd74564aaeadc22222ff4
    
    
    # 給node節點添加node标簽(支援kubectl的節點上執行)
    kubectl label nodes k8s-node01 k8s-node02 node-role.kubernetes.io/node=
               

繼續閱讀