1. 程式人生 > 實用技巧 >Kubeadm 部署kubernetes

Kubeadm 部署kubernetes

一、環境準備

1.1 作業系統

角色IP部署內容
master 192.168.10.109 kubeadm kubelet kubectl
node1 192.168.10.107 kubeadm kubelet
node2 192.168.10.108 kubeadm kubelet

  修改/etc/hosts檔案,加入maste和node節點資訊

1.2 關閉防火牆

systemctl stop firewalld
systemctl disable firewalld

1.3 關閉swap

1 swapoff -a
2 修改/etc/fstab 註釋掉關於swap部分

二、安裝docker

2.1 安裝

安裝docker
1.更新yum包
    yum update
2.解除安裝舊版本
    yum remove docker
3.安裝依賴
    yum install -y yum-utils device-mapper-persistent-data lvm2
4.設定yum源
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
5.安裝docker
    yum install docker-ce
6.啟動docker
    systemctl start docker
    systemctl enable docker 
7.驗證安裝是否成功 docker version

2.2 替換國內源

vi /etc/docker/daemon.json
{
    "registry-mirrors": ["https://registry.docker-cn.com"]
}
systemctl restart docker.service

2.3 配置k8s源

 1 /etc/yum.repos.d/kubernetes.repo
 2 
 3 [kubernetes]
 4 name=Kubernetes Repo
 5 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
6 gpgcheck=1 7 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg 8 enable=1 9 10 11 wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg 12 rpm --import rpm-package-key.gpg 13 yum repolist

三、安裝Kubernetes

以下部分在master上執行

3.1 安裝kubeadm和相關工具

yum -y install kubelet kubeadm kubectl --disableexcludes=kubernets

此時kubectl可能會起不來,可以在kubeadm init完成後再啟動

3.2 kubeadm config

執行kubeadm config print init-defaults,獲取預設的初始化引數檔案

kubeadm config print init-defaults > init.default.yaml

將該檔案儲存備用

3.3 列出所需的映象列表

kubeadm config images list

k8s.gcr.io/kube-apiserver:v1.18.3
k8s.gcr.io/kube-controller-manager:v1.18.3
k8s.gcr.io/kube-scheduler:v1.18.3
k8s.gcr.io/kube-proxy:v1.18.3
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7
 k8s.gcr.io映象倉庫地址在國內無法訪問,可以使用下面地址替代
 registry.cn-hangzhou.aliyuncs.com/google_containers
沒有v1.18.3就找v1.18.2
images=(kube-apiserver:v1.18.3kube-controller-manager:v1.18.3kube-scheduler:v1.18.3kube-proxy:v1.18.3pause:3.2etcd:3.4.3-0coredns:1.6.7
)

for imageName in ${images[@]};do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName  k8s.gcr.io/$imageName
    docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName

3.4 初始化環境

kubeadm init 
# 這一步注意,如果需要特定的網路外掛,需要額外加引數,具體看網路外掛的介紹
儲存好 kubeadm join的資訊
kubeadm join 192.168.10.109:6443 --token 3fntt0.e0k8ivnl1p6cxesy \
    --discovery-token-ca-cert-hash sha256:f98b963683b0370f6b24ca7ea4577a08acbf9ce9a88902aadfe115b8a2c258a7

報錯資訊  
以下修改在node節點上也執行

1)detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".
修改或建立/etc/docker/daemon.json,加入下面的內容:
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl restart docker

2)/proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1

echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables


3)/proc/sys/net/ipv4/ip_forward contents are not set to 1
echo "1" >/proc/sys/net/ipv4/ip_forward

[ERROR Swap]: running with swap on is not supported. Please disable swap
swapoff -a
vim /etc/fstab 註釋掉swap部分

3.5 配置授權資訊

按照init最後部分提示執行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
此時已經在master上安裝完成了Kubernetes,但叢集內還沒有可以用的Node,並缺乏對容器網路的配置
啟動master上的kubelet
systemctl start kubelet && systemctl enable kubelet

Kubernetes官方預設策略是worker節點執行Pod,master節點不執行Pod。如果為了測試或開發目的部署單節點叢集,可以通過以下命令設定:

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

3.6 配置node節點

對於新節點的加入,系統準備和Kubernetes yum源配置過程一樣

yum install kubelet kubeadm --disableexcludes=kubernetes

將node節點加入叢集

kubeadm join 192.168.10.109:6443 --token 3fntt0.e0k8ivnl1p6cxesy  \
   --discovery-token-ca-cert-hash sha256:f98b963683b0370f6b24ca7ea4577a08acbf9ce9a88902aadfe115b8a2c258a7

在node節點上啟動kubelet

systemctl start kubelet && systemctl enable kubelet

四、網路外掛

在master上執行kubectl get nodes命令,會發現Kubernetes提示節點為NotReady狀態,這是因為還沒有安裝CNI網路外掛

# kubectl get nodes
NAME     STATUS     ROLES    AGE     VERSION
master   NotReady   master   27m     v1.18.3
node1    NotReady   <none>   4m26s   v1.18.3
node2    NotReady   <none>   4m5s    v1.18.3

4.1 flannel

需要在kubeadm init 時設定 --pod-network-cidr=10.244.0.0/16

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

4.2 weave

sysctl net.bridge.bridge-nf-call-iptables=1
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

4.3 calico

需要 kubeadm init 時設定 --pod-network-cidr=192.168.0.0/16

kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml 

例如選擇weave外掛,執行命令安裝

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

4.5驗證Kubernetes叢集是否安裝成功

kubectl  get pods -n kube-system

NAME                             READY   STATUS    RESTARTS   AGE
coredns-66bff467f8-hqqz7         1/1     Running   0          73m
coredns-66bff467f8-z2hr4         1/1     Running   0          73m
etcd-master                      1/1     Running   1          73m
kube-apiserver-master            1/1     Running   1          73m
kube-controller-manager-master   1/1     Running   1          73m
kube-proxy-fhzcv                 1/1     Running   0          50m
kube-proxy-jhmp5                 1/1     Running   0          50m
kube-proxy-n7ldl                 1/1     Running   1          73m
kube-scheduler-master            1/1     Running   1          73m
weave-net-2d6sz                  2/2     Running   0          32m
weave-net-jfxbt                  2/2     Running   0          32m
weave-net-kmj98                  2/2     Running   0          32m

其中有些可能不能啟動,大部分原因就是映象獲取不到,如果是k8s.gcr.io倉庫的,可以把之前下載

到master上的映象匯入到node節點上

檢視pod啟動失敗的原因 
kubectl -n kube-system describe pod <pod-name>

檢視節點是否都Ready

# kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   73m   v1.18.3
node1    Ready    <none>   50m   v1.18.3
node2    Ready    <none>   50m   v1.18.3

至此,通過kubeadm工具就實現了Kubernetes叢集的安裝。