一文教你從零快速搭建k8s集群

1.引言

k8s想必大家并不陌生,它可以方便我們進(jìn)行docker容器的集中管理和編排操作,減小運(yùn)維難度,提升服務(wù)質(zhì)量,本文就讓我們來(lái)一起看一下如何從零快速搭建k8s集群吧。

2.服務(wù)器硬件要求

在部署k8s集群之前,服務(wù)器需要滿足以下條件:

1.三臺(tái)虛擬機(jī)服務(wù)器(推薦使用vmware下載鏡像安裝),操作系統(tǒng)CentOS 7.x-86_x64。
2.硬盤最低配置:內(nèi)存2GB,CPU2核,硬盤30GB。
3.機(jī)器之間網(wǎng)絡(luò)互通。
4.可以訪問(wèn)外網(wǎng),需要拉取鏡像。
5.禁止swap分區(qū)。(kubernetes的想法是將實(shí)例緊密包裝到盡可能接近100%。 所有的部署應(yīng)該與CPU /內(nèi)存限制固定在一起。 所以如果調(diào)度程序發(fā)送一個(gè)pod到一臺(tái)機(jī)器,它不應(yīng)該使用交換。 設(shè)計(jì)者不想交換,因?yàn)樗鼤?huì)減慢速度,所以關(guān)閉swap主要是為了性能考慮)

3. 部署方式以及區(qū)別

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

3.1.kubeadmin
kubeadm是一個(gè)k8s部署工具,提供kubeadmin init初始化集群和kubeadm join加入集群,用于快速部署k8s集群。
3.2.二進(jìn)制包
從GitHub下載發(fā)行版的二進(jìn)制包,手動(dòng)部署每個(gè)組件,組成k8s集群。

目前k8s的組件都是通過(guò)systemd來(lái)維護(hù)的,所以二進(jìn)制安裝,調(diào)試bug比較方便。

普遍性來(lái)講,使用kubeadm可以帶來(lái)標(biāo)準(zhǔn)化安裝的完整步驟。并且kubeadm已經(jīng)是一個(gè)開源項(xiàng)目,團(tuán)隊(duì)投入精力,后面產(chǎn)出都融入到這個(gè)項(xiàng)目中了。而二進(jìn)制安裝屬于優(yōu)化版本,自己維護(hù),自己使用。沒(méi)有社區(qū)的協(xié)作,之后的維護(hù)成本高于回報(bào)。如果沒(méi)有特別的要求,推薦直接使用kubeadm組件來(lái)搭建自己的安裝k8s的工具鏈。

4. 搭建k8s集群

4.1 準(zhǔn)備環(huán)境
k8s-master 192.168.40.136
k8s-node1 192.168.40.139
k8s-node2 192.168.40.140

節(jié)點(diǎn)ip根據(jù)自己的實(shí)際ip而定,虛擬機(jī)設(shè)置一下固定ip,避免重啟后ip發(fā)生變化!

4.2 系統(tǒng)初始化

關(guān)閉防火墻:

systemctl stop firewalld

禁止防火墻開機(jī)自啟:

systemctl disable firewalld

關(guān)閉selinux:

# 永久關(guān)閉(需重啟)
sed -i 's/enforcing/disabled/' /etc/selinux/config
reboot
#臨時(shí)關(guān)閉
setenforce 0

關(guān)閉swap分區(qū):

# 永久關(guān)閉(需重啟)
sed -ri 's/.*swap.*/#&/' /etc/fstab
reboot
#臨時(shí)關(guān)閉
swapoff -a

設(shè)置主機(jī)名:

# 在master上執(zhí)行
hostnamectl set-hostname k8s-master
# 在node1上執(zhí)行
hostnamectl set-hostname k8s-node1
# 在node2上執(zhí)行
hostnamectl set-hostname k8s-node2

在每個(gè)節(jié)點(diǎn)添加hosts:

# 改為自己實(shí)際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的鏈:

在每個(gè)節(jié)點(diǎn)添加如下的命令:

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  

在每個(gè)節(jié)點(diǎn)添加時(shí)間同步:

# 安裝ntpdate時(shí)間同步插件
yum install ntpdate -y
# 開啟時(shí)間同步
ntpdate time.windows.com

在每個(gè)節(jié)點(diǎn)安裝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
# 授權(quán)、運(yùn)行、檢查是否加載:
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

4.3 所有節(jié)點(diǎn)安裝Docker/kubeadm/kubelet/kubectl

k8s默認(rèn)CRI(容器運(yùn)行時(shí))為Docker,因此需要先安裝Docker!

所有節(jié)點(diǎn)安裝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
# 設(shè)置開機(jī)自啟動(dòng)并啟動(dòng)
systemctl enable docker && systemctl start docker
# 查看版本
docker version
# 設(shè)置鏡像加速器
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:

# 指定版本號(hào)安裝
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 為了實(shí)現(xiàn)Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,需要修改"/etc/sysconfig/kubelet"文件的內(nèi)容:
vim /etc/sysconfig/kubelet
# 修改
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
# 設(shè)置開機(jī)自啟動(dòng)
systemctl enable kubelet

4.4 部署k8s的Master節(jié)點(diǎn)

# 由于默認(rèn)拉取鏡像地址k8s.gcr.io國(guó)內(nèi)無(wú)法訪問(wèn),這里需要指定阿里云鏡像倉(cāng)庫(kù)地址
# 只在master執(zhí)行
kubeadm init \
  # 此處填寫實(shí)際ip,其他地方不用動(dòng)
  --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
# 配置環(huán)境變量(只在master執(zhí)行) 
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節(jié)點(diǎn)

# 在master節(jié)點(diǎn)獲取token:
kubeadm token create --print-join-command --ttl 0
# 在node1和node2添加如下的命令向k8s集群中添加Node節(jié)點(diǎn)(為上方命令返回的內(nèi)容,復(fù)制即可):
kubeadm join 192.168.40.136:6443 --token yruyio.n4hal2qdb5iweknf     --discovery-token-ca-cert-hash sha256:0ac7ed632224e1e07cef223b1159d03b2231dfc0456817db7eaf3c8651eef49c
# 獲取所有節(jié)點(diǎn)(正??梢垣@取到master,node1和node2)
kubectl get nodes

4.6 部署CNI網(wǎng)絡(luò)插件

在master節(jié)點(diǎn)部署CNI網(wǎng)絡(luò)插件:

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

查看集群健康狀態(tài):

kubectl get cs
kubectl cluster-info

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

5.測(cè)試kubernetes集群

在Kubernetes集群中創(chuàng)建一個(gè)pod,驗(yàn)證是否正常運(yùn)行,這里以nginx為例:

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

訪問(wèn) http://192.168.40.136:32627:


測(cè)試訪問(wèn)

至此,我們已經(jīng)成功部署了一個(gè)nginx的deployment,deployment控制對(duì)應(yīng)的pod的生命周期,service則對(duì)外提供相應(yīng)的服務(wù)。

6.部署 Dashboard

Dashboard是k8s的一套桌面管理應(yīng)用,通過(guò)Dashboard我們可以通過(guò)可視化的方式查看k8s集群的狀態(tài),執(zhí)行相關(guān)的操作,但沒(méi)有kubectl來(lái)的簡(jiǎn)單直接,了解一下即可。

首先需要下載kubernetes-dashboard.yaml,這個(gè)文件現(xiàn)在也被墻了,大家可以通過(guò)科學(xué)上網(wǎng)或者文末獲??!

在master執(zhí)行以下命令:

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

訪問(wèn)https://192.168.40.136:30001

谷歌訪問(wèn)可能會(huì)被禁止,可以通過(guò)以下操作解決:

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
#創(chuàng)建新的證書secret
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kube-system
#查看pod復(fù)制dashboard的pod名稱
kubectl get pod -n kube-system
#重啟pod(刪除會(huì)自動(dòng)重啟)
kubectl delete pod <pod name> -n kube-system

如下,通過(guò)令牌方式訪問(wèn):


令牌訪問(wèn)

獲取token:

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

復(fù)制,點(diǎn)擊登錄,稍等片刻即可:


Dashboard

結(jié)語(yǔ)

本文到這里就結(jié)束了,主要介紹了k8s集群的部署方式以及具體步驟,感興趣的朋友可以在本地虛擬機(jī)搭建一套,至于k8s中組件的作用以及使用方式,大家可以在網(wǎng)上自行查閱,在集群中執(zhí)行相關(guān)命令自行體會(huì)學(xué)習(xí),k8s在實(shí)際的生產(chǎn)中主要用于系統(tǒng)的自動(dòng)化部署,自動(dòng)擴(kuò)縮容等,幫助我們提升運(yùn)維效率,作為程序員我們也要熟悉其常用的命令以及原理,掌握到一定程度之后可以嘗試基于k8s開發(fā)一套自動(dòng)化運(yùn)維管理平臺(tái),可以擴(kuò)充我們的知識(shí)面,提升自己的技術(shù)水平!

注:關(guān)注公眾號(hào) 螺旋編程極客 發(fā)送 k8s 獲取相關(guān)yaml資源

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容