k8s環境搭建--基於kubeadm方法

環境

master node: 數量 1, 系統 ubuntu 16.04_amd64
worker node: 數量 1, 系統 ubuntu 16.04_amd64
kubernetes 版本: v1.10.07node

安裝docker

執行docker.shlinux

sudo -E bash docker.sh

部署kubernetes(master node)

如下操做在master node 上執行:git

  1. 執行selinux_ipv6.sh,關閉selinux、開啓ipv6:github

    #!/bin/sh
    
        # 關閉 selinux
        sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
        setenforce 0
    
        # 開啓ipv6
        cat <<EOF > /etc/sysctl.conf
        net.bridge.bridge-nf-call-ip6tables = 1
        net.bridge.bridge-nf-call-iptables = 1
        EOF
    
        modprobe br_netfilter
        sysctl -p

    執行腳本:docker

    sudo bash selinux_ipv6.sh
  2. 下載k8s.io鏡像
    對照表
    如上表所示的鏡像都是咱們所須要的,可是因爲網絡環境的限制致使咱們沒法直接從gcr.io的源地址拉去鏡像,只能在本地事先下載好所須要的鏡像,執行k8s_v1.10_images_download.sh腳本便可:shell

    sudo bash k8s_v1.10_images_download.sh
  3. 安裝kubeadm
    首先,在source.list.d中添加阿里的kubernetes源:json

    # 添加源
        cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
        deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main   
        EOF
    
        # 安裝源證書
        curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
    
        # 更新源
        apt-get update

    注意,須要在root帳戶下執行以上命令。ubuntu

    而後安裝kubeadm相關組件:segmentfault

    apt-get install -y  kubeadm=1.10.7-00
  4. 初始化 kubernetes 服務api

    kubeadm init --kubernetes-version=v1.10.7 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=0.0.0.0 --ignore-preflight-errors='Swap'

    顯示結果以下:

    Your Kubernetes master has initialized successfully!
         To start using your cluster, you need to run the following as a regular user:
    
         mkdir -p $HOME/.kube
         sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
         sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
         You should now deploy a pod network to the cluster.
         Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
         https://kubernetes.io/docs/concepts/cluster-administration/addons/
    
         You can now join any number of machines by running the following on each node
         as root:
    
         kubeadm join 192.168.1.185:6443 --token ow8gkw.yltjigl52r7q3jlq --discovery-token-ca-cert-hash sha256:aa2e50c49a35bcf65edfcf6081159adbf27d7d5a09707d584636a9ab4e1e7b3c

    按照上面顯示的指示,copy kube-config:

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

    查看當前節點狀態:

    kubectl get nodes

    顯示結果以下:

    NAME                             STATUS    ROLES     AGE       VERSION
         whty0-to-be-filled-by-o-e-m      NotReady     master    2h        v1.10.7

    之因此沒有處於Ready狀態,是由於咱們尚未配置 可使得kubernetes節點之間互相通訊的網絡插件.

添加worker節點(worker node)

經過kubeadm上面顯示的token就能夠,引導其餘節點加入到k8s集羣:

  1. 關閉selinux、開啓ipv6
    參照上一節

  2. 下載k8s.io鏡像
    參照上一節

  3. 安裝kubeadm 組件
    參照上一節

  4. 引導worker node 加入集羣:

    sudo kubeadm join 192.168.1.185:6443 --token ow8gkw.yltjigl52r7q3jlq --discovery-token-ca-cert-hash sha256:aa2e50c49a35bcf65edfcf6081159adbf27d7d5a09707d584636a9ab4e1e7b3c --ignore-preflight-errors='swap' --ignore-preflight-errors='cri'

    這裏所傳入的token就是在master節點上初始化時最後顯示的token,須要注意的是token是具備有效期的,在有效期事後須要從新發放token,最終顯示結果以下:

    [preflight] Running pre-flight checks.
         [WARNING SystemVerification]: docker version is greater than the most recently validated version. Docker version: 18.06.1-ce. Max validated version: 17.03
         [WARNING CRI]: unable to check if the container runtime at "/var/run/dockershim.sock" is running: exit status 1
         [WARNING Swap]: running with swap on is not supported. Please disable swap
         [discovery] Trying to connect to API Server "192.168.1.185:6443"
         [discovery] Created cluster-info discovery client, requesting info from "https://192.168.1.185:6443"
         [discovery] Requesting info from "https://192.168.1.185:6443" again to validate TLS against the pinned public key
         [discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "192.168.1.185:6443"
         [discovery] Successfully established connection with API Server "192.168.1.185:6443"

安裝跨主機網絡插件

   想要在集羣中部署的容器能夠跨節點互相通訊則須要安裝網絡插件,kubernetes的網絡插件有不少種,咱們這裏只說兩種 calico 和 flannel。

calico

   咱們這裏經過安裝網絡插件容器的方式來部署, 所使用的是cni網絡插件。主要有兩個配置文件:rabc-kdd.yaml用來配置權限,而calico.yaml用於配置calico插件:

kubectl apply -f ./rbac-kdd.yaml
    kubectl apply -f ./calico.yaml

   這裏須要提醒你們的是,咱們在calico.yaml中有以下配置:

# Auto-detect the BGP IP address.
    # value: "autodetect"
    - name: IP
        value: "autodetect"
    - name: IP_AUTODETECTION_METHOD
        value: interface=enp1s.*,wlx.*
    - name: FELIX_HEALTHENABLED
        value: "true"

   IP:autodetect 指定了cni插件自動去識別主機的地址,IP_AUTODETECTION_METHOD:interface=enp1s.*,wlx.* 則指定了主機的物理網卡名稱(enp1s是有線網卡的前綴、wlx是無線網卡前綴),支持通配符的方式來匹配,因此咱們在安裝的時候須要注意本地物理網卡的名稱本身進行適當的修改。

   此外還有以下配置用來劃定pod的IP地址範圍:

- name: CALICO_IPV4POOL_CIDR
          value: "10.244.0.0/16"

   注意:要與 kubeadm init 時指定的ip範圍一致。
   部署成功後咱們能夠查看當前在線節點:

NAME                             STATUS    ROLES     AGE       VERSION
whty0-to-be-filled-by-o-e-m      Ready     master    2h        v1.10.7
whtyhust-to-be-filled-by-o-e-m   Ready     <none>    1h        v1.10.7

flannel

   與calico相同,咱們flannel也使用一樣的方式來部署,只要按照如下步驟執行便可:

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

  注意: 須要kubernetes的版本在1.7以上才行,此外在 flannel.yml中有以下配置:

net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

   此處Network的地址範圍要與 kubeadm init 時指定的範圍一致。

容許在master node 上建立資源(Optional)

  在master node 上執行

kubectl taint nodes --all node-role.kubernetes.io/master-

  顯示結果以下:

taint "node-role.kubernetes.io/master:" not found
    taint "node-role.kubernetes.io/master:" not found

   執行以上命令後,在部署 k8s資源時 master node會像 worker node同樣被對待,不然默認不會在master節點上部署 k8s 資源

kudeadm token 生成

   在咱們安裝了kubernetes集羣后可能過一段時間須要添加一個節點,當你使用最初的token去加入節點時發現token失效了,這是由於這個token是有時間限制的。只有從新的生成token才能把節點加入,token的生成過程以下:

  1. 建立token

    kubeadm token create

    顯示結果以下:

    [kubeadm] WARNING: starting in 1.8, tokens expire after 24 hours by default (if you require a non-expiring token use --ttl 0)
         aa78f6.8b4cafc8ed26c34f

    此處的aa78f6.8b4cafc8ed26c34f 就是新生成的token。

  2. 獲取api server ca 證書的hash

    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

    顯示結果以下:

    0fd95a9bc67a7bf0ef42da968a0d55d92e52898ec37c971bd77ee501d845b538
  3. 加入新節點:

    kubeadm join --token aa78f6.8b4cafc8ed26c34f --discovery-token-ca-cert-hash sha256:0fd95a9bc67a7bf0ef42da968a0d55d92e52898ec37c971bd77ee501d845b538  172.16.6.79:6443

其它

   不一樣的網絡插件實現的機制不一致,其中flannel+vxlan的方式比較流行,咱們須要後續的研究和比較,哪一種類型的插件更加高效。好比在做者實際的工做過程當中,遇到過如下問題:

   使用kubernetes搭建fabric-kafka分佈式服務,在使用calcio時kafka服務的zookeeper節點之間頻繁連接超時,即便修改了超時等待時間仍然沒法解決問題,但在一樣的環境中,使用了flannel+vxlan插件以後zookeeper之間能夠穩定的連接。

   此外,當使用flannel+vxlan後有可能在建立pod的過程當中遇到以下問題:

network: failed to set bridge addr: \"cni0\" already has an IP address different from 10.244.1.1/24"

   這是由於在反覆安裝kubernetes過程當中cni的歷史數據並無清除乾淨,這個問題在後續版本中已經被修復,但在1.10.7版本中仍然存在這個問題,能夠經過執行如下命令來完全清除cni歷史數據:

#!/bin/sh

    kubeadm reset
    systemctl stop kubelet
    systemctl stop docker
    rm -rf /var/lib/cni/
    rm -rf /var/lib/kubelet/*
    rm -rf /etc/cni/
    ifconfig cni0 down
    ifconfig flannel.1 down
    ifconfig docker0 down
    ip link delete cni0
    ip link delete flannel.1

    systemctl start kubelet
    systemctl start docker

參考網址:

相關文章
相關標籤/搜索