保姆級教程:從零快速搭建 k8s 集羣

  1. 引言

k8s 想必大家並不陌生,它可以方便我們進行 docker 容器的集中管理和編排操作,減小運維難度,提升服務質量,本文就讓我們來一起看一下如何從零快速搭建 k8s 集羣吧。

  1. 服務器硬件要求

在部署 k8s 集羣之前,服務器需要滿足以下條件:

  1. 三臺虛擬機服務器(推薦使用 vmware 下載鏡像安裝),操作系統 CentOS 7.x-86_x64。
  2. 硬盤最低配置:內存 2GB,CPU2 核,硬盤 30GB。
  3. 機器之間網絡互通。
  4. 可以訪問外網,需要拉取鏡像。
  5. 禁止 swap 分區。(kubernetes 的想法是將實例緊密包裝到儘可能接近 100%。所有的部署應該與 CPU / 內存限制固定在一起。所以如果調度程序發送一個 pod 到一臺機器,它不應該使用交換。設計者不想交換,因爲它會減慢速度,所以關閉 swap 主要是爲了性能考慮)

  1. 部署方式以及區別

目前部署 k8s 集羣主要有兩種方式:

3.1 kubeadmin
kubeadm 是一個 k8s 部署工具,提供 kubeadmin init 初始化集羣和 kubeadm join 加入集羣,用於快速部署 k8s 集羣。
3.2 二進制包
從 GitHub 下載發行版的二進制包,手動部署每個組件,組成 k8s 集羣。

目前 k8s 的組件都是通過 systemd 來維護的,所以二進制安裝,調試 bug 比較方便。

普遍性來講,使用 kubeadm 可以帶來標準化安裝的完整步驟。並且 kubeadm 已經是一個開源項目,團隊投入精力,後面產出都融入到這個項目中了。而二進制安裝屬於優化版本,自己維護,自己使用。沒有社區的協作,之後的維護成本高於回報。如果沒有特別的要求,推薦直接使用 kubeadm 組件來搭建自己的安裝 k8s 的工具鏈。

  1. 搭建 k8s 集羣

4.1 準備環境
k8s-master 192.168.40.136
k8s-node1 192.168.40.139
k8s-node2 192.168.40.140

節點 ip 根據自己的實際 ip 而定,虛擬機設置一下固定 ip,避免重啓後 ip 發生變化!

4.2 系統初始化

關閉防火牆:

systemctl stop firewalld

禁止防火牆開機自啓:

systemctl disable firewalld

關閉 selinux:

# 永久關閉(需重啓)
sed -i 's/enforcing/disabled/' /etc/selinux/config
reboot
#臨時關閉
setenforce 0

關閉 swap 分區:

# 永久關閉(需重啓)
sed -ri 's/.*swap.*/#&/' /etc/fstab
reboot
#臨時關閉
swapoff -a

設置主機名:

# 在master上執行
hostnamectl set-hostname k8s-master
# 在node1上執行
hostnamectl set-hostname k8s-node1
# 在node2上執行
hostnamectl set-hostname k8s-node2

在每個節點添加 hosts:

# 改爲自己實際ip
cat >> /etc/hosts << EOF
192.168.40.136 k8s-master
192.168.40.139 k8s-node1
192.168.40.140 k8s-node2
EOF

將橋接的 IPv4 流量傳遞到 iptables 的鏈:

在每個節點添加如下的命令:

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
# 加載br_netfilter模塊
modprobe br_netfilter
# 查看是否加載
lsmod | grep br_netfilter
# 生效
sysctl --system

在每個節點添加時間同步:

# 安裝ntpdate時間同步插件
yum install ntpdate -y
# 開啓時間同步
ntpdate time.windows.com

在每個節點安裝 ipset 和 ipvsadm:

# 安裝
yum -y install ipset ipvsadm
# 配置
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
# 授權、運行、檢查是否加載:
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

4.3 所有節點安裝 Docker/kubeadm/kubelet/kubectl

k8s 默認 CRI(容器運行時)爲 Docker,因此需要先安裝 Docker!

所有節點安裝 Docker:

# 獲取鏡像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 安裝
yum -y install docker-ce-18.06.3.ce-3.el7
# 設置開機自啓動並啓動
systemctl enable docker && systemctl start docker
# 查看版本
docker version
# 設置鏡像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=systemd"],    
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
# 重載配置
sudo systemctl daemon-reload
# 重啓docker
sudo systemctl restart docker
# 添加阿里雲的yum軟件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安裝 kubeadm、kubelet 和 kubectl:

# 指定版本號安裝
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 爲了實現Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,需要修改"/etc/sysconfig/kubelet"文件的內容:vim /etc/sysconfig/kubelet
# 修改
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
# 設置開機自啓動
systemctl enable kubelet

4.4 部署 k8s 的 Master 節點

# 由於默認拉取鏡像地址k8s.gcr.io國內無法訪問,這裏需要指定阿里雲鏡像倉庫地址
# 只在master執行
kubeadm init \
  # 此處填寫實際ip,其他地方不用動
  --apiserver-advertise-address=192.168.40.136 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.18.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16
# 配置環境變量(只在master執行) 
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

4.5 添加 k8s 的 Node 節點

# 在master節點獲取token:
kubeadm token create --print-join-command --ttl 0
# 在node1和node2添加如下的命令向k8s集羣中添加Node節點(爲上方命令返回的內容,複製即可):
kubeadm join 192.168.40.136:6443 --token yruyio.n4hal2qdb5iweknf     --discovery-token-ca-cert-hash sha256:0ac7ed632224e1e07cef223b1159d03b2231dfc0456817db7eaf3c8651eef49c
# 獲取所有節點(正常可以獲取到master,node1和node2)
kubectl get nodes

4.6 部署 CNI 網絡插件

在 master 節點部署 CNI 網絡插件:

# 此鏈接被牆了,需要科學上網解決,或者在文末獲取相關資源
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
# 查看部署進度(可能會出現鏡像拉取失敗的情況,耐心等待一會就好了)
kubectl get pods -n kube-system

查看集羣健康狀態:

kubectl get cs
kubectl cluster-info

至此,k8s 集羣基本搭建完畢!

  1. 測試 kubernetes 集羣

在 Kubernetes 集羣中創建一個 pod,驗證是否正常運行,這裏以 nginx 爲例:

# 創建deployment
kubectl create deployment nginx --image=nginx
# 修改端口類型爲nodePort供外界訪問 編輯方式跟vim一樣
kubectl edit svc nginx
...
spec:
  clusterIP: 10.106.212.113
  externalTrafficPolicy: Cluster
  ports:
  # 外界暴露指定端口 32627(30000-32767)
  - nodePort: 32627
    # 容器暴露的端口
    port: 80
    protocol: TCP
    # 集羣內訪問的單口
    targetPort: 80
  selector:
    app: nginx
  sessionAffinity: None
  # type改爲NodePort
  type: NodePort
  ...

訪問 http://192.168.40.136:32627:

至此,我們已經成功部署了一個 nginx 的 deployment,deployment 控制對應的 pod 的生命週期,service 則對外提供相應的服務。

  1. 部署 Dashboard

Dashboard 是 k8s 的一套桌面管理應用,通過 Dashboard 我們可以通過可視化的方式查看 k8s 集羣的狀態,執行相關的操作,但沒有 kubectl 來的簡單直接,瞭解一下即可。

首先需要下載 kubernetes-dashboard.yaml,這個文件現在也被牆了,大家可以通過科學上網或者文末獲取!

在 master 執行以下命令:

kubectl apply -f kubernetes-dashboard.yaml
# 開啓代理 ip寫自己實際ip
kubectl proxy --address=192.168.40.136 --disable-filter=true &

訪問 https://192.168.40.136:30001

谷歌訪問可能會被禁止,可以通過火狐訪問或以下操作解決:

mkdir key && cd key
#生成證書
openssl genrsa -out dashboard.key 2048 
openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=192.168.246.200'
openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt 
#刪除原有的證書secret
kubectl delete secret kubernetes-dashboard-certs -n kube-system
#創建新的證書secret
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kube-system
#查看pod複製dashboard的pod名稱
kubectl get pod -n kube-system
#重啓pod(刪除會自動重啓)
kubectl delete pod <pod name> -n kube-system

如下,通過令牌方式訪問:

獲取 token:

kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/cluster-admin/{print $1}')

複製粘貼,點擊登錄,稍等片刻即可:

結語

本文到這裏就結束了,主要介紹了 k8s 集羣的部署方式以及具體步驟,感興趣的朋友可以在本地虛擬機搭建一套,至於 k8s 中組件的作用以及使用方式,大家可以在網上自行查閱,在集羣中執行相關命令自行體會學習,k8s 在實際的生產中主要用於系統的自動化部署,自動擴縮容等,幫助我們提升運維效率,作爲程序員我們也要熟悉其常用的命令以及原理,掌握到一定程度之後可以嘗試基於 k8s 開發一套自動化運維管理平臺,可以擴充我們的知識面,提升自己的技術水平!

注:關注公衆號 螺旋編程極客 發送 k8s 獲取相關 yaml 資源

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/QDJx2p8T5bKJmW6rxcF-EQ