本文首發於我的個人網站: https://hewanyue.com/
本文作者: Hechao
本文鏈接: https://hewanyue.com/blog/107b7ce7.html
本文將介紹通過kubeadm部署K8s集羣的詳細過程,且通過兩個mater節點實現K8s集羣的高可用。
本次演示使用 k8s 官方提供的部署工具 kubeadm 自動安裝, 需要在 master 和 node 節點上安裝 docker 等組件, 然後初始化, 把管理端的控制服務和 node 上的服務都以pod 的方式運行。
架構結構示意圖如下路所示
環境搭建(master及node節點均爲ubuntu1804):
master1:192.168.32.18
master2:192.168.32.19
harbor:192.168.32.20
node1:192.168.32.21
node2:192.168.32.22
需要禁用 swap, selinux, iptables。
swapoff -a
搭建master節點
安裝keepalived
可以通過apt快速安裝或者源碼編譯,下面以apt包管理工具安裝爲例
apt update
apt install keepalived -y
cp /usr/share/doc/keepalived/samples/keepalived.conf.vrrp /etc/keepalived/keepalived.conf
然後修改配置文件,實例如下
! Configuration File for keepalived
global_defs {
notification_email {
acassen
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface eth0
garp_master_delay 10
smtp_alert
virtual_router_id 32
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
# optional label. should be of the form "realdev:sometext" for
# compatibility with ifconfig.
172.18.32.250 label eth0:1
}
}
另一個節點也安裝keepalived,然後測試VIP是否可以漂移成功。
安裝 docker
在主節點上先安裝docker,詳細可參考之前文章。
可以通過阿里雲鏡像,使用腳本來安裝vim docker1806.sh
#!/bin/bash
# step 1: 安裝必要的一些系統工具
apt-get update
apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安裝GPG證書
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 寫入軟件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新並安裝Docker-CE
apt-get -y update
apt-get -y install docker-ce=18.06.0~ce~3-0~ubuntu
# 安裝指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
# docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安裝指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]
bash docker1806.sh
配置阿里加速器
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://360k4x9i.mirror.aliyuncs.com","https://registry.docker-cn.com"],
"insecure-registries": ["https://harbor.local.com"],
"bip": "10.20.0.1/24"
}
安裝kubeadm
先配置k8s的鏡像源,並安裝kubeadm
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat >/etc/apt/sources.list.d/kubernetes.list <<EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt install kubeadm=1.16.1-00 kubectl=1.16.1-00 kubelet=1.16.1-00
systemctl start kubelet && systemctl enable kubelet
安裝K8s
因爲默認使用的是google的鏡像倉庫,國內是連接不上的,所以我們最好提前下載好鏡像。本次演示安裝版本爲kubernetes v1.16.1
先查看需要下載的鏡像及版本
kubeadm config images list --kubernetes-version v1.16.1
k8s.gcr.io/kube-apiserver:v1.16.1
k8s.gcr.io/kube-controller-manager:v1.16.1
k8s.gcr.io/kube-scheduler:v1.16.1
k8s.gcr.io/kube-proxy:v1.16.1
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.15-0
k8s.gcr.io/coredns:1.6.2
我們先去阿里雲鏡像倉庫提前下載好鏡像,可以通過快速實現.。如果有harbor服務器,可以先上傳到本地harbor。
#!/bin/bash
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.16.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.16.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.16.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.16.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.3.15-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.2
master 初始化
因爲我們打算做master的高可用。所以我們在master初始化時,要加選項--control-plane-endpoint=172.18.32.250
指定``VIP`。只需在一個master節點上做初始化即可。
kubeadm init \
--apiserver-advertise-address=172.18.32.18 \
--control-plane-endpoint=172.18.32.250 \
--apiserver-bind-port=6443 \
--kubernetes-version=v1.16.1 \
--pod-network-cidr=10.10.0.0/16 \
--service-cidr=10.20.0.0/16 \
--service-dns-domain=k8s.local \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
--ignore-preflight-errors=swap
也可以基於yaml文件而不是用命令行命令來進行初始化。可以使用命令kubeadm init --config kubeadm-init.yaml
,基於文件初始化。
kubeadm config print init-defaults
輸出默認初始化配置
kubeadm config print init-defaults > kubeadm-init.yaml
將默認配置輸出至文件
root@k8s-master1:~# cat kubeadm-init.yaml #修改後的初始化文件內容
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 172.18.32.18
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master1.k8s.local
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 172.18.32.250:6443 #添加基於 VIP 的 Endpoint
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.16.1
networking:
dnsDomain: k8s.local
podSubnet: 10.10.0.0/16
serviceSubnet: 10.20.0.0/16
scheduler: {}
初始化成功,記錄下來--token
和--discovery-token-ca-cert-hash
,,之後加入其他節點時需要用到。
如果初始化失敗了需要 使用命令kubeadm reset可以清除已有容器數據以便重新安裝,PS:此命令如果在安裝完成後使用會清除已創建的k8s集羣。
配置kube證書
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
配置網卡
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
加入其他節點
其他三臺k8s節點也要安裝docker及k8s,可以通過腳本快速實現
vim node.sh
#!/bin/bash
# step 1: 安裝必要的一些系統工具
apt-get update
apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安裝GPG證書
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 寫入軟件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新並安裝Docker-CE
apt-get -y update
apt-get -y install docker-ce=18.06.0~ce~3-0~ubuntu
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://360k4x9i.mirror.aliyuncs.com","https://registry.docker-cn.com"],
"insecure-registries": ["https://harbor.local.com"],
"bip": "10.20.0.1/24"
}
EOF
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat >/etc/apt/sources.list.d/kubernetes.list <<EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt install kubeadm=1.16.1-00 kubectl=1.16.1-00 kubelet=1.16.1-00 -y
systemctl start kubelet && systemctl enable kubelet
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.16.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.16.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.16.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.16.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.3.15-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.2
systemctl enable --now docker kubelet
當前 maste 生成證書用於添加新控制節點:
kubeadm init phase upload-certs --upload-certs
得到--certificate-key
的值,也要記錄下來。
之後想加入哪個節點,就在哪個節點上操作。先加入另一個master節點。
kubeadm join 172.18.32.250:6443 --token 89beqy.13jxavbu7yz3187d \
--discovery-token-ca-cert-hash sha256:7388af4f1662805a844cce7c1371facb83f32dddb998370d11bfb41957fe75bf \
--certificate-key 3630d5719795c77e7071d77a206cc17078c912f9c3915e76e70bb26e75e26178 \
--control-plane
再加入各個node節點,命令區別是少了--control-plane
選項以及控制祕鑰。
kubeadm join 172.18.32.250:6443 --token 89beqy.13jxavbu7yz3187d \
--discovery-token-ca-cert-hash sha256:7388af4f1662805a844cce7c1371facb83f32dddb998370d11bfb41957fe75bf
之後通過命令,就可以看到4個主機都處於ready
狀態了。至此k8s集羣的搭建就完成了。
kubectl get node