1. 程式人生 > 程式設計 >k8s安裝教程(CentOS7.7)

k8s安裝教程(CentOS7.7)

安裝說明

  • OS是CentOS Linux release 7.7.1908 (Core)
  • docker-ce最新版本
  • kubernetes16.2

解除安裝原來的Docker版本

如果之前沒有安裝過可以略過。

# yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

docker預設將映象、容器、儲存卷和網路等存在 /var/lib/docker下,在解除安裝老版本的docker時,該目錄下的內容是不被刪除的.

安裝Docker

該教程採用docker的線上倉庫來安裝,也可以通過手動下載指定版本的rpm包來安裝。

安裝docker的線上倉庫

  1. 安裝所需的依賴包

# yum install -y yum-utils device-mapper-persistent-data lvm2

  1. 安裝線上的穩定倉庫

# yum-config-manage --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安裝docker引擎社群版本

  1. 安裝最新的docker-engine,docker-cli,containerd

# yum install -y docker-ce docker-ce-cli containerd.io

  1. 安裝指定版本的docker-engine,docker-ce-cli,containerd.io

首先通過 yum list docker-ce --showduplicates | sort -r 列出可以安裝的穩定版本,然後從中選出指定版本安裝。

# yum list docker-ce --showduplicates | sort -r

# yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

  1. 啟動容器

# systemctl start docker

安裝k8s master節點

使用kubeadm安裝,安裝過程中有些映象無法下載需要單獨處理。

master節點的環境配置及依賴

  1. 在所有需要運⾏kubelet的節點上關閉swap

# swapoff -a

Kubernetes官⽅安裝⽂檔給出的理由是You MUST disable swap in order for the kubelet to work properly. ⽽在實際執⾏過程中發現如果不執 ⾏,則kubeadm直接報錯並停⽌執⾏,錯誤資訊說明⽐如禁⽤swap。每次重啟都要執⾏swapoffff。TODO 要想辦法⾃動化執⾏。

  1. 關閉防火牆

# systemctl disable firewalld && systemctl stop firwalld

  1. 關閉SELinux

#setenforce 0

在master上安裝kubeadm,kubelet,kubectl

kubeadm能夠輔助⾃動化安裝kubernetes,但是kubeadm不會⾃動安裝kubectl和kubelet。這兩者需要⼿動安裝。

  1. 把server binary⾥的kubeadm,kubectl三個binary複製到 /usr/bin 下

server binary是Kubernetes github上release的編譯好的Kubernetes版本,包括各元件的⼆進位制和映象。進⼊Kubernetes release⻚⾯,點 擊某個release的changelog,如: CHANGELOG-1.10.8.md ),下載其中的server binary壓縮包

  1. 下載kubelet的systemd unit定義⽂件,其中的RELEASE變數需要提前export出來,如 v1.16.2

    #export RELEASE=v1.16.2

    #curl -sSL "raw.githubusercontent.com/kubernetes/…" > /etc/systemd/system/kubelet.service

  2. 下載kubeadm配置檔案

    #mkdir -p /etc/systemd/system/kubelet.service.d`

    #curl -sSL "raw.githubusercontent.com/kubernetes/…" > /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

  3. 設定kubelet開機自啟動

    #systemctl enable kubelet

Kubernetes控制⾯的其他元件都通過kubelet啟動,所以只要配置了kubelet的開機⾃啟動,kubelet就會去讀/etc/kubernetes/manifests⽬錄下 的static pod配置,實現etcd、kube-apiserver、kube-controller-manager、kube-scheduler4個元件不⽤單獨啟動 kubeadm官⽅安裝⽂檔在⼿動安裝的guide⾥(也就是clear linux環境下的guide),推薦安裝CNI plugins和ctrctl。但是我沒安裝並沒發現錯 誤。

配置docker的cgroup driver為kubernetes推薦的systemd

下⾯步驟 kubeadmin init 的時候會提⽰docker使⽤的cgroup driver是cgroupfs,但是The recommended driver is "systemd",可以參考這篇⽂章把 docker配置成⽤systemd作為driver:

cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": { "max-size": "100m" },"storage-driver": "overlay2" } EOF

Restart docker.

#systemctl daemon-reload && systemctl restart docker
複製程式碼

以上步驟完成之後kubelet會不停重啟,是正常現象,不⽤緊張,接下來開始安裝Kubernetes控制平⾯。

官⽅⽂檔關於kubelet重啟的解釋是:The kubelet is now restarting every few seconds,as it waits in a crashloop for kubeadm to tell it what to do.

以上步驟中kubelet等來⾃changlog⾥的server binary,採⽤⼿動安裝的⽅式。更加⽅便的是採⽤對應linux distro下的安裝包。當前不清楚每個 Kubernetes release對應的kubelet等三個⽂件的版本是什麼,只看到changlog⾥的server binary⾥包含了kubelet,也沒有從k8s官⽹找到官⽅下載 地址

安裝master節點上元件

  1. 提前load控制平⾯映象

根據官⽅⽂檔中Running kubeadm without an internet connection⼩節內容,kubeadm在init過程中需要啟動控制平⾯,因此需要在此之前將控制平⾯ 的對應版本的映象準備好。

1. 準備apiserver,controller manager,scheduler和kubeproxy元件映象。將server binary中包含的映象壓縮包load進master節點即可。⽐如:

# docker load -i kube-scheduler.tar 
複製程式碼

kubernetes 1.16.2版本的時候,load進⼊的映象名字已經直接可⽤ 但是kubernetes 1.10.8版的時候load完成之後還需要修改映象名,因為server binary中提供的映象load進去之後映象名字不滿⾜kubelet的 要求。以kube-proxy為例,load進去之後名字是 k8s.gcr.io/kube-proxy:v1.10.8 ,並不是static pod中需要的 k8s.gcr.io/kubeproxy-amd64:v1.10.8 ,因此需要重新tag。執⾏的命令如下: 在這個repo⾥,我寫了⼀個shell指令碼ldrnk8simgs.sh來載入和重新命名這些 映象

kube-proxy⽤daemonset啟動,並⾮static pod,但是可以⽤相同的命名規則。

2. 準備etcd映象

執⾏ kubeadm init --kubernetes-version=v1.16.2 --pod-network-cidr10.244.0.0/16,在kubernetes 1.16.2版本中,kubeadm並不會在
複製程式碼

下載映象之前把static pod的manifest寫到 /etc/kubernetes/manifest/ 下,因此需要等待前⾯的 kubeadm init 下載映象執⾏錯誤,才能得到正 確的etcd映象名稱: failed to load k8s.gcr.io/etcd:3.3.10 。 翻牆下載docker映象的⽅法: 找到 docker.service ⽂件所在(18.09版預設在 /lib/systemd/system/docker.service ),在所在⽬錄建立⽬錄 mkdir /lib/systemd/system/docker.service.d ,在其中建立 http-proxy.conf ⽂件,內容為:

 [Service]
Environment="HTTP_PROXY=http://127.0.0.1:1080/"
複製程式碼

注意: 映象下載完之後把上⾯的配置⽂件刪了。

3. 準備pause映象

和前⾯的情況⼀樣, kubeadm init 執⾏錯誤之後會給出正確的pause映象名稱: failed to pull image k8s.gcr.io/pause:3.1

4. 準備coredns映象

和前⾯的情況⼀樣, kubeadm init 執⾏錯誤之後會給出正確的pause映象名稱: failed to pull image k8s.gcr.io/coredns:1.3.1
複製程式碼
  1. master節點安裝(kubeadm init)

kubeadm init --kubernetes-version=v1.16.2 --pod-network-cidr=10.244.0.0/16

其中:

1. --kubernetes-version告訴kubeadm具體需要安裝什麼版本的Kubernetes

2. --pod-network-cidr=192.168.0.0/16 flflag的值跟具體⽹絡⽅案有關,這個值對應後⾯的calico⽹絡⽅案,⽽如果安裝的是flflannel,則根據官⽅⽂檔則
    應該是--pod-network-cidr=10.244.0.0/16
複製程式碼

如果所有映象就緒,則kubeadm init步驟執⾏時間只有不到⼀分鐘。如果安裝過程遇到錯誤需要重試,則重試之前運⾏ kubeadm reset 。

  1. 配置kubectl

下⾯安裝pod⽹絡的使⽤了kubectl,需要在此之前執⾏如下配置:

- 如果後續流程使⽤root賬⼾執⾏,則執⾏

#export KUBECONFIG=/etc/kubernetes/admin.conf

為了以後⽅便可以寫到<home>/.profifile下

- 如果後續流程使⽤⾮root賬⼾執⾏,則執⾏:

# mkdir -p $HOME/.kube

# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 

# chown $(id -u):$(id -g) $HOME/.kube/config
複製程式碼
  1. 安裝pod⽹絡

這⾥選擇calico,按照Kubernetes官⽅安裝⽂檔操作即可:

#kubectl apply -f https://docs.projectcalico.org/v3.7/manifests/calico.yaml
複製程式碼
  1. 允許pod排程到master節點上,否則master節點的狀態會是not ready(可選,如果⽤來做單節點叢集則執⾏此步)

預設會在kubeadm init過程中taint master節點,可以通過執⾏以下命令使pod能夠被排程到master節點上:

#kubectl taint nodes --all node-role.kubernetes.io/master-
複製程式碼
  1. 執⾏到這步,我們已經有⼀個單節點Kubernetes叢集,可以運⾏pod。如果需要更多node加⼊,則下⾯可以開始把別的節點join到叢集⾥

  2. 如果需要從⾮master節點上遠端⽤kubectl操作Kubernetes叢集,則是需要把kubectl和admin.conf在遠端機器上準備好,執⾏如下指令: scp root@:/etc/kubernetes/admin.conf . 為了驗證kubectl是否可以連線到apiserver,執⾏: kubectl --kubeconfig ./admin.conf get nodes ,注意⾥⾯的kubeconfifig flflag。

安裝 Node節點上的元件

  1. swapoffff -a

  2. 安裝docker

  3. 安裝kubeadm,kubectl

    1. 把前⾯下載的server binary⾥包含的kubeadm,kubectl三個binary複製到 /usr/bin 下

    changelog⻚⾯的node binary⾥的kube-proxy是⼆進位制,並⾮docker映象,還是把server binary複製到node節點上

    1. 下載kubelet的systemd service定義⽂件,其中的RELEASE變數為版本號,如 v1.10.8

    #export RELEASE=v1.16.2

    #curl -sSL "raw.githubusercontent.com/kubernetes/…" > /etc/systemd/system/kubelet.service

    #kubeadm join的時候會通過這個systemd unit⽂件啟動kubelet

    1. 下載kubeadm配置⽂件

    經過測試這個是必須的,否則kubeadm join顯⽰成功,但是在kubectl get nodes始終⽆法得到剛剛join的node。似乎是kubelet找不到 bootstrap-kubelet.conf,⽽在10-kubeadm.conf會指定這個⽂件的⽬錄)

    mkdir -p /etc/systemd/system/kubelet.service.d

    curl -sSL "raw.githubusercontent.com/kubernetes/…" > /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

    1. 設定kubelet開機啟動⾃動,並啟動kubelet:

    systemctl enable kubelet && systemctl start kubelet

  4. 準備映象

未來可能排程到node上的映象都要準備好:

1. kube-proxy會通過daemonset排程到node
2. calico也會通過daemonset排程到node
3. pause

controller-manager,scheduler,apiserver,etcd通過static pod在master上啟動,肯定不會排程到node上
複製程式碼
  1. kubeadm join

在node上執行:

kubeadm join --token : --discovery-token-ca-cert-hash sha256:

這條命令在master上kubeadm init的結束時會在console上顯⽰

其中:

1. <token>在master上⽣成,可以在master上執⾏如下命令得到當前所有有效/失效的token

kubeadm token list`

token有效期為24⼩時,如果全都失效了,可以執⾏如下命令⽣成新的token:

kubeadm token create

2. <master-ip>:<master-port>為master的ip端⼝,端⼝預設6443(Kubernetes的secure port)

3. <hash>可以在master上執⾏如下命令檢視

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
複製程式碼

openssl dgst -sha256 -hex | sed 's/^.* //'

hash形如:

8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78

執⾏到這⾥join已經完成,可以在⼏秒鐘後在master上執⾏kubectl get nodes檢視當前叢集內的node。

新加⼊的node role為none,似乎不影響⼯作

不需要在node上安裝cni,join時顯⽰的preflflight check中提⽰缺少ebtables也可以不要
複製程式碼

之江實驗室kubeedge原始碼分析群二維碼入口