使用kubeadm部署安裝K8s

本文首發於我的個人網站: https://hewanyue.com/
本文作者: Hechao
本文鏈接: https://hewanyue.com/blog/107b7ce7.html

  本文將介紹通過kubeadm部署K8s集羣的詳細過程,且通過兩個mater節點實現K8s集羣的高可用。
  本次演示使用 k8s 官方提供的部署工具 kubeadm 自動安裝, 需要在 master 和 node 節點上安裝 docker 等組件, 然後初始化, 把管理端的控制服務和 node 上的服務都以pod 的方式運行。
  架構結構示意圖如下路所示
K8s架構
  環境搭建(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
發佈了43 篇原創文章 · 獲贊 52 · 訪問量 9172
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章