使用 kubeadm 構建 kubernetes 集羣.md

kubeadm 簡介

Kubeadm 是一種工具,旨在爲建立 Kubernetes 集羣提供最佳實踐「快速路徑」。node

它執行必要的操做,以用戶友好的方式啓動和運行最低可行,安全的羣集。linux

Kubeadm 的範圍僅限於本地節點文件系統和 Kubernetes API,它旨在成爲更高級別工具的可組合構建塊。git

環境

主機名 IP地址 CPU 內存(G) 備註
k8s1 172.16.10.3 4 8 master節點
k8s2 172.16.10.4 4 8 master節點
k8s3 172.16.10.22 4 8 master節點
k8s4 172.16.10.20 4 8 worker節點
k8s5 172.16.10.19 4 8 worker節點
k8s6 172.16.10.21 4 8 worker節點

添加hosts

cat >> /etc/hosts <<EOF
172.16.10.3    k8s1
172.16.10.4    k8s2
172.16.10.22   k8s3
172.16.10.20  k8s4
172.16.10.19  k8s5
172.16.10.21  k8s6
EOF
複製代碼

檢查服務器至少知足下面的條件:

  1. 每一個節點的惟一主機名,MAC地址和product_uuidgithub

  2. 防火牆放行應用端口docker

  3. 禁用交換分區json

驗證MAC地址和product_uuid對於每一個節點都是惟一的

  • 可使用命令ip link 或 ifconfig -a 獲取網絡接口的MAC地址api

  • 可使用下面命令檢查product_uuid安全

    sudo cat /sys/class/dmi/id/product_uuid
    複製代碼

關閉 SELinux 和 Firewalld

setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
複製代碼
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT
複製代碼

加載模塊

modprobe br_netfilter
lsmod | grep br_netfilter
複製代碼

內核優化

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
複製代碼

安裝容器運行時

自v1.6.0起,Kubernetes默認啓用了CRI (Container Runtime Interface) 。bash

從v1.14.0開始,kubeadm將嘗試經過掃描衆所周知的套接字列表來自動檢測Linux節點上的容器運行時。 能夠在下表中找到所使用的可檢測運行時和套接字路徑。服務器

Runtime Domain Socket
Docker /var/run/docker.sock
containerd /run/containerd/containerd.sock
CRI-O /var/run/crio/crio.sock

若是同時檢測到Docker和containerd,則Docker優先。

由於Docker 18.09附帶了containerd,二者都是可檢測的。

若是檢測到任何其餘兩個或更多運行時,kubeadm將退出並顯示相應的錯誤消息。

若是選擇的容器運行時是Docker,則經過內置的dockershimCRI實現使用它 kubelet。

安裝最新穩定版的 docker-ce

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
複製代碼

建立 daemon.json

mkdir -p /etc/docker
cat > daemon.json <<EOF
{
  "registry-mirrors": ["http://f1361db2.m.daocloud.io"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

systemctl restart docker
複製代碼

安裝 kubeadm,kubelet 和 kubectl

使用阿里雲的源,安裝kubeadm軟件等

worker節點能夠不安裝kubectl

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
yum install -y kubelet-1.14.2 kubeadm-1.14.2 kubectl-1.14.2
systemctl enable kubelet
複製代碼

下載鏡像

使用以下的命令打印出須要的鏡像

$ kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.14.2
k8s.gcr.io/kube-controller-manager:v1.14.2
k8s.gcr.io/kube-scheduler:v1.14.2
k8s.gcr.io/kube-proxy:v1.14.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1
複製代碼

gcr.io 域名在大陸不可訪問,咱們使用以下的腳本下載鏡像

Container Registry Proxy

#!/bin/bash 
set -o errexit
set -o nounset

KUBE_VERSION=v1.14.2
KUBE_PAUSE_VERSION=3.1
ETCD_VERSION=3.3.10
DNS_VERSION=1.3.1

GCR_URL=k8s.gcr.io
HUB_URL=gcr.azk8s.cn/google_containers

images=("kube-apiserver:${KUBE_VERSION}" "kube-controller-manager:${KUBE_VERSION}" "kube-scheduler:${KUBE_VERSION}" "kube-proxy:${KUBE_VERSION}" "pause:${KUBE_PAUSE_VERSION}" "etcd:${ETCD_VERSION}" "coredns:${DNS_VERSION}")

for imageName in ${images[@]} ; do
  docker pull $HUB_URL/$imageName
  docker tag  $HUB_URL/$imageName $GCR_URL/$imageName
  docker rmi  $HUB_URL/$imageName
done
複製代碼

高可用拓撲

能夠設置以下兩種HA 集羣

  • 使用堆疊的控制平面節點,其中etcd節點與控制平面節點共存
  • 使用外部etcd節點,etcd在控制平面的不一樣節點上運行

Stacked etcd topology

每一個控制平面節點運行的一個kube-apiserver,kube-scheduler和kube-controller-manager實例。

kube-apiserver使用負載均衡器暴露於工做節點。

每一個控制平面節點建立一個本地etcd成員,該etcd成員僅與該節點的kube-apiserver通訊。

這一樣適用於本地kube-controller-manager 和kube-scheduler實例。

該拓撲將控制平面和etcd成員耦合在相同節點上。設置比具備外部etcd節點的集羣更簡單,而且更易於管理複製。

可是,堆疊集羣存在耦合失敗的風險。若是一個節點發生故障,則etcd成員和控制平面實例都將丟失,而且冗餘會受到影響。您能夠經過添加更多控制平面節點來下降此風險。

所以,您應該爲HA羣集運行至少三個堆疊的控制平面節點。

kubeadm-ha-topology-stacked-etcd

External etcd topology

由etcd提供的分佈式數據存儲集羣在運行控制平面組件的節點造成的集羣外部。

在外部ETCD拓撲中的每一個控制平面節點運行的一個kube-apiserver,kube-scheduler和kube-controller-manager實例。

而且kube-apiserver使用負載均衡器暴露給工做節點。可是,etcd成員在不一樣的主機上運行,​​每一個etcd主機與控制平面節點的kube-apiserver進行通訊。

將控制平面和etcd成員分離。所以,它提供了HA設置,其中丟失控制平面實例或etcd成員具備較小的影響而且不像堆疊的HA拓撲那樣影響集羣冗餘。

可是,此拓撲須要兩倍於堆疊HA拓撲的主機數。具備此拓撲的HA羣集至少須要三個用於控制平面節點的主機和三個用於etcd節點的主機。

kubeadm-ha-topology-external-etcd

這邊機選擇第一種方案: stacked etcd topology

爲kube-apiserver 建立負載均衡器

建立一個負載均衡器,其名稱能夠解析爲DNS

  • 在雲環境中,您應將控制平面節點置於TCP轉發負載平衡器以後。此負載均衡器將流量分配到其目標列表(master節點)中的全部健康控制平面節點。apiserver的運行情況檢查是對kube-apiserver偵聽的端口的TCP檢查(默認值:6443)。

  • 不建議直接在雲環境中使用IP地址。(實驗環境下,沒有設置DNS解析,直接使用IP代替)

  • 負載均衡器必須可以與apiserver端口上的全部控制平面節點通訊。它還必須容許其偵聽端口上的傳入流量。

  • HAProxy可用做負載均衡器。

  • 確保負載均衡器的地址始終與kubeadm的地址匹配ControlPlaneEndpoint。

京東雲內網負載均衡監聽配置截圖:

slb-lister
virtual-server-group

若是沒有SLB,也可使用Haproxy

Haproxy配置文件見 haproxy.cfg

堆疊控制平面和etcd節點

第一個控制平面節點的步驟

  1. 在第一個控制平面節點上,建立一個名爲的配置文件kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: 1.14.2
controlPlaneEndpoint: "172.16.10.5:6443"
networking:
  serviceSubnet: "10.96.0.0/12"
  podSubnet: "10.244.0.0/16"
  dnsDomain: "cluster.local"
複製代碼
  • kubernetesVersion應該設置爲使用的Kubernetes版本。這邊使用1.14.2

  • controlPlaneEndpoint 應匹配負載均衡器的地址或DNS和端口。

  • networking 設置CNI 網絡插件須要的CIDR

  1. 初始化控制平面:
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs
複製代碼
  • --experimental-upload-certs標誌用於將應在全部控制平面實例之間共享的證書上載到羣集。相反,若是您但願手動或使用自動化工具跨控制平面節點複製證書,請刪除此標誌並參考手動證書分發部分。

命令執行完成以後,輸出相似下面:

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 the control-plane node running the following command on each as root:

  kubeadm join 172.16.10.5:6443 --token o8d1ee.tzswy9o52p6m00i4 \
    --discovery-token-ca-cert-hash sha256:56047868636349ca477d271496689f5d83055d8ff3e2cc594b5a419501962d18 \
    --experimental-control-plane --certificate-key d19b85d6692cde12ad8a85fd882b45293c2cda35b32edb2ad217192c8b836821

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --experimental-upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 172.16.10.5:6443 --token o8d1ee.tzswy9o52p6m00i4 \
    --discovery-token-ca-cert-hash sha256:56047868636349ca477d271496689f5d83055d8ff3e2cc594b5a419501962d18
複製代碼

3.安裝flannel網絡插件

flannel 文檔

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.11.0/Documentation/kube-flannel.yml
複製代碼

安裝其他控制平面節點

kubeadm join 172.16.10.5:6443 --token o8d1ee.tzswy9o52p6m00i4 \
    --discovery-token-ca-cert-hash sha256:56047868636349ca477d271496689f5d83055d8ff3e2cc594b5a419501962d18 \
    --experimental-control-plane --certificate-key d19b85d6692cde12ad8a85fd882b45293c2cda35b32edb2ad217192c8b836821
複製代碼

安裝worker節點

kubeadm join 172.16.10.5:6443 --token o8d1ee.tzswy9o52p6m00i4 \
    --discovery-token-ca-cert-hash sha256:56047868636349ca477d271496689f5d83055d8ff3e2cc594b5a419501962d18
複製代碼

確認節點已所有安裝完成

$ kubectl get nodes
NAME   STATUS   ROLES    AGE     VERSION
k8s1   Ready    master   2d13h   v1.14.2
k8s2   Ready    master   2d13h   v1.14.2
k8s3   Ready    master   2d13h   v1.14.2
k8s4   Ready    <none>   2d13h   v1.14.2
k8s5   Ready    <none>   2d13h   v1.14.2
k8s6   Ready    <none>   2d13h   v1.14.2
$ kubectl get pod -n kube-system
NAME                           READY   STATUS    RESTARTS   AGE
coredns-fb8b8dccf-g4lf5        1/1     Running   0          2d13h
coredns-fb8b8dccf-z4rrq        1/1     Running   0          2d13h
etcd-k8s1                      1/1     Running   0          2d13h
etcd-k8s2                      1/1     Running   0          2d13h
etcd-k8s3                      1/1     Running   0          2d13h
kube-apiserver-k8s1            1/1     Running   0          2d13h
kube-apiserver-k8s2            1/1     Running   0          2d13h
kube-apiserver-k8s3            1/1     Running   1          2d13h
kube-controller-manager-k8s1   1/1     Running   1          2d13h
kube-controller-manager-k8s2   1/1     Running   0          2d13h
kube-controller-manager-k8s3   1/1     Running   0          2d13h
kube-flannel-ds-amd64-22j5p    1/1     Running   0          2d13h
kube-flannel-ds-amd64-2gnxf    1/1     Running   0          2d13h
kube-flannel-ds-amd64-bbttc    1/1     Running   0          2d13h
kube-flannel-ds-amd64-st9xk    1/1     Running   0          2d13h
kube-flannel-ds-amd64-v5bjs    1/1     Running   0          2d13h
kube-flannel-ds-amd64-wqsrq    1/1     Running   0          2d13h
kube-proxy-5wxg5               1/1     Running   0          2d13h
kube-proxy-6j5kj               1/1     Running   0          2d13h
kube-proxy-9f9sm               1/1     Running   0          2d13h
kube-proxy-j2c4p               1/1     Running   0          2d13h
kube-proxy-lhtjv               1/1     Running   0          2d13h
kube-proxy-rxbwj               1/1     Running   0          2d13h
kube-scheduler-k8s1            1/1     Running   1          2d13h
kube-scheduler-k8s2            1/1     Running   0          2d13h
kube-scheduler-k8s3            1/1     Running   0          2d13h
複製代碼
相關文章
相關標籤/搜索