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節點 |
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
複製代碼
每一個節點的惟一主機名,MAC地址和product_uuidgithub
防火牆放行應用端口docker
禁用交換分區json
可使用命令ip link 或 ifconfig -a 獲取網絡接口的MAC地址api
可使用下面命令檢查product_uuid安全
sudo cat /sys/class/dmi/id/product_uuid
複製代碼
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。
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
複製代碼
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軟件等
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 域名在大陸不可訪問,咱們使用以下的腳本下載鏡像
#!/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 集羣
每一個控制平面節點運行的一個kube-apiserver,kube-scheduler和kube-controller-manager實例。
kube-apiserver使用負載均衡器暴露於工做節點。
每一個控制平面節點建立一個本地etcd成員,該etcd成員僅與該節點的kube-apiserver通訊。
這一樣適用於本地kube-controller-manager 和kube-scheduler實例。
該拓撲將控制平面和etcd成員耦合在相同節點上。設置比具備外部etcd節點的集羣更簡單,而且更易於管理複製。
可是,堆疊集羣存在耦合失敗的風險。若是一個節點發生故障,則etcd成員和控制平面實例都將丟失,而且冗餘會受到影響。您能夠經過添加更多控制平面節點來下降此風險。
所以,您應該爲HA羣集運行至少三個堆疊的控制平面節點。
由etcd提供的分佈式數據存儲集羣在運行控制平面組件的節點造成的集羣外部。
在外部ETCD拓撲中的每一個控制平面節點運行的一個kube-apiserver,kube-scheduler和kube-controller-manager實例。
而且kube-apiserver使用負載均衡器暴露給工做節點。可是,etcd成員在不一樣的主機上運行,每一個etcd主機與控制平面節點的kube-apiserver進行通訊。
將控制平面和etcd成員分離。所以,它提供了HA設置,其中丟失控制平面實例或etcd成員具備較小的影響而且不像堆疊的HA拓撲那樣影響集羣冗餘。
可是,此拓撲須要兩倍於堆疊HA拓撲的主機數。具備此拓撲的HA羣集至少須要三個用於控制平面節點的主機和三個用於etcd節點的主機。
這邊機選擇第一種方案: stacked etcd topology
建立一個負載均衡器,其名稱能夠解析爲DNS
在雲環境中,您應將控制平面節點置於TCP轉發負載平衡器以後。此負載均衡器將流量分配到其目標列表(master節點)中的全部健康控制平面節點。apiserver的運行情況檢查是對kube-apiserver偵聽的端口的TCP檢查(默認值:6443)。
不建議直接在雲環境中使用IP地址。(實驗環境下,沒有設置DNS解析,直接使用IP代替)
負載均衡器必須可以與apiserver端口上的全部控制平面節點通訊。它還必須容許其偵聽端口上的傳入流量。
HAProxy可用做負載均衡器。
確保負載均衡器的地址始終與kubeadm的地址匹配ControlPlaneEndpoint。
京東雲內網負載均衡監聽配置截圖:
若是沒有SLB,也可使用Haproxy
Haproxy配置文件見 haproxy.cfg
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
kubeadm init --config=kubeadm-config.yaml --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
複製代碼
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
複製代碼