參考文章:部署k8s叢集(k8s叢集搭建詳細實踐版)
k8s Github位址:https://github.com/kubernetes/kubernetes
k8s元件簡介:k8s叢集概念元件簡介
1、部署k8s的兩種方式:
目前生産部署Kubernetes叢集主要有兩種方式:
- kubeadm
Kubeadm是一個K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes叢集。
- 二進制包
從github下載下傳發行版的二進制包,手動部署每個元件,組成Kubernetes叢集。
本實驗采用kubeadm的方式搭建叢集。
2、環境準備
2.1 伺服器要求:
- 建議最小硬體配置:2核CPU、2G記憶體、20G硬碟
- 伺服器最好可以通路外網,會有從網上拉取鏡像需求,如果伺服器不能上網,需要提前下載下傳對應鏡像并導入節點
2.2 軟體環境:
- 作業系統:centos7.9_x64(mini)
- Docker:20-ce
- K8s:1.23
2.3 伺服器規劃:(本實驗采用虛拟機)
- k8s-master:192.168.178.171
- k8s-node1:192.168.178.172
- k8s-node2:192.168.178.173
3、初始化配置
3.1、安裝環境準備:
下面的操作需要在所有的節點上執行。
# 1. 關閉防火牆 (全部節點)
$. systemctl stop firewalld
$. systemctl disable firewalld
$. systemctl status firewalld
# 2. 關閉selinux (全部節點)
$. sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
$. setenforce 0 # 臨時
$. sestatus -v # 檢視狀态
# 3. 關閉 swap (全部節點)
$. swapoff -a # 臨時
$. sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
# 4. 根據規劃設定主機名
# 更改四台機器的名稱,分别是:k8s-master、k8s-node1、k8s-node2
$. hostnamectl set-hostname <hostname>
$. hostname k8s-node1
$. bash
# 5.叢集每個節點添加 hosts
$. cat >> /etc/hosts << EOF
192.168.178.171 k8s-master
192.168.178.172 k8s-node1
192.168.178.173 k8s-node2
EOF
# 6. 修改核心參數, 将橋接的IPv4流量傳遞到iptables的鍊
$. cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 生效
$. sysctl --system
# 7. 時間同步 (全部節點)
$. yum install ntpdate -y
$. ntpdate time.windows.com
# 或者采用 chrony
$. yum install chrony -y
$. systemctl start chronyd
$. systemctl enable chronyd
$. chronyc sources
# 注意:虛拟機不管關機還是挂起,每次重新操作都需要更新時間進行同步。
3.2、安裝容器運作時
容器運作時可以安裝 Docker 或 CRI-O.
3.2.1 安裝CRI-O 容器運作時【所有節點】
3.2.1.1 準備
$. VERSION=1.23
$. sudo curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/CentOS_7/devel:kubic:libcontainers:stable.repo
$. sudo curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:${VERSION}.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:${VERSION}/CentOS_7/devel:kubic:libcontainers:stable:cri-o:${VERSION}.repo
3.2.1.2 安裝
$. yum update -y
$. yum install cri-o cri-tools -y
注意:從 1.24.0 開始,cri-o 包不再依賴 containernetworking-plugins 包,已删除此依賴項,允許使用者在不删除檔案的情況下,就能安裝自己的 CNI 插件。
如果想要使用以前提供的那些 CNI 插件,還應運作:
3.2.1.3 檢視cri-o版本
[root@node1 systemd]# rpm -qi cri-o
Name : cri-o
Epoch : 0
Version : 1.22.5
Release : 2.2.el7
Architecture: x86_64
Install Date: 2022年07月13日 星期三 01時36分47秒
Group : Unspecified
Size : 236845729
License : ASL 2.0
Signature : RSA/SHA256, 2022年07月10日 星期日 12時53分28秒, Key ID 4d64390375060aa4
Source RPM : cri-o-1.22.5-2.2.el7.src.rpm
Build Date : 2022年07月10日 星期日 12時53分00秒
Build Host : sheep87
Relocations : (not relocatable)
Vendor : obs://build.opensuse.org/devel:kubic
URL : https://github.com/cri-o/cri-o
Summary : Open Container Initiative-based implementation of Kubernetes Container Runtime Interface
Description :
Open Container Initiative-based implementation of Kubernetes Container Runtime
Interface.
3.2.1.4 設定開機啟動, 并啟動cri-o
$. systemctl enable crio --now
3.2.1.5 檢視cri-o狀态
[root@node1 systemd]# systemctl status crio
● crio.service - Container Runtime Interface for OCI (CRI-O)
Loaded: loaded (/usr/lib/systemd/system/crio.service; enabled; vendor preset: disabled)
Active: active (running) since 三 2022-07-13 01:41:06 CST; 16h ago
Docs: https://github.com/cri-o/cri-o
Main PID: 24127 (crio)
Tasks: 15
Memory: 13.7M
CGroup: /system.slice/crio.service
└─24127 /usr/bin/crio
三台機都安裝cri-o并啟動。
CRI-O常用指令參考:CRI-O常用指令詳解
3.2.2 安裝docker 容器運作時【所有節點】
如果安裝了CRI-O, 則不需要再安裝 Docker 了。
3.2.2.1 docker 容器運作時安裝
# 1. 設定穩定的安裝源(存儲庫)
$. yum install yum-utils -y
$. yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 2. 導入證書
$. rpm --import http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-7
# 3. 安裝
$. yum list docker-ce --showduplicates | sort -r
$. yum install -y docker-ce-20.10.10 docker-ce-cli-20.10.10 containerd.io
# 4. 啟動和驗證
$. systemctl enable docker --now
$. docker version
# or
$. docker -v
$. docker run hello-world
3.2.2.2 配置鏡像下載下傳加速器:
$. vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
$. systemctl restart docker
$. docker info #檢視docker資訊,進行确認
3.3 安裝kubeadm、kubelet、kubectl【所有節點】
- Kubelet:運作在cluster所有節點上,負責啟動POD和容器;
- Kubeadm:用于初始化cluster的一個工具;
- Kubectl:kubectl是kubenetes指令行工具,通過kubectl可以部署和管理應用,檢視各種資源,建立,删除和更新元件;
3.3.1 添加阿裡雲軟體源(所有節點)
$. 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
3.3.2 yum安裝kubeadm、kubelet、kubectl元件(所有節點)
$. yum list kubelet --showduplicates | sort -r
$. yum list kubeadm --showduplicates | sort -r
$. yum list kubectl --showduplicates | sort -r
$. yum install -y kubelet-1.23.16 kubeadm-1.23.16 kubectl-1.23.16
$. systemctl enable kubelet --now
$. systemctl status kubelet
# 如果 kubelet 運作失敗, 可用下面指令檢視日志
$. journalctl -u kubelet --no-pager
# 配置kubelet的cgroup
$. vim /etc/sysconfig/kubelet
# 添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
4、部署k8s-master【master執行】
4.1、初始化k8s
kubeadm部署(需要等上一會)
$. kubeadm init \
--apiserver-advertise-address=192.168.178.171 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.16 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
# 初始化之後,會輸出一個join指令,先複制出來,node節點加入master會使用。:
kubeadm join 10.122.32.2:6443 --token 206c1m.4rs3nl232gme92mu \
--discovery-token-ca-cert-hash sha256:c5ecb1edd7aaf5253e0002e4cb396fd83d3455012c216a4ef30c4ffd92d289dc
- --apiserver-advertise-address 叢集master位址, 使用的是master和node間能互相ping通的ip
- --image-repository 由于預設拉取鏡像位址k8s.gcr.io國内無法通路,這裡指定阿裡雲鏡像倉庫位址
- --kubernetes-version K8s版本,與上面安裝的一緻
- --service-cidr 叢集内部虛拟網絡,Pod統一通路入口
- --pod-network-cidr Pod網絡,與下面部署的CNI網絡元件yaml中保持一緻
4.2、拷貝k8s認證檔案
$. mkdir -p $HOME/.kube
$. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$. sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.3 檢視工作節點:
$. kubectl get nodes
注:以上,安裝master節點完畢。可以使用kubectl get nodes檢視一下,由于網絡插件還沒有部署,此時master處于NotReady狀态。
5、配置k8s的node節點【node節點操作】
5.1、node節點加入叢集
執行在kubeadm init輸出的kubeadm join指令, 在node節點運作剛才記錄的最後一行:
$. kubeadm join 10.122.32.2:6443 --token 206c1m.4rs3nl232gme92mu \
--discovery-token-ca-cert-hash sha256:c5ecb1edd7aaf5253e0002e4cb396fd83d3455012c216a4ef30c4ffd92d289dc
# 如果忘記token, 檢視token
$. kubeadm token list
# 預設token有效期為24小時,當過期之後,該token會過期,
# 需要重新建立token,可以直接使用指令快捷生成:
$. kubeadm token create --print-join-command
# 檢視discovery-token-ca-cert-hash
$. openssl x509 -pubkey \
-in /etc/kubernetes/pki/ca.crt \
| openssl rsa -pubin -outform der 2>/dev/null \
| openssl dgst -sha256 -hex | sed 's/^.* //'
# 加入成功後,在master節點檢視到加入的Node節點
$. kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 15m v1.23.16
k8s-node1 Ready <none> 4m14s v1.23.16
k8s-node2 Ready <none> 117s v1.23.16
k8s-node3 Ready <none> 2m1s v1.23.16
6、部署容器網絡
6.1 安裝Calico 網絡(master執行)
Calico是一個純三層的資料中心網絡方案,是目前Kubernetes主流的網絡方案。
下載下傳YAML:
$. wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml
注意:
下載下傳完後還需要修改裡面定義Pod網絡(CALICO_IPV4POOL_CIDR),與前面kubeadm init的 --pod-network-cidr指定的一樣。
修改完後檔案後,進行部署:
$. kubectl apply -f calico.yaml
# 執行結束要等上一會才全部running
$. kubectl get pods -n kube-system
待Calico Pod都Running後,節點也會準備就緒。
注:以後所有yaml檔案都隻在Master節點執行。
安裝目錄:/etc/kubernetes/
元件配置檔案目錄:/etc/kubernetes/manifests/
6.2 安裝flannel(master機器)(這裡不做部署, 僅做參考)
建立網絡flannel
# 1. 下載下傳官方fannel配置檔案
$. kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 2. 安裝fannel
$. kubectl apply -f kube-flannel.yml
# 檢視元件運作,發現flannel已經在運作
$. kubectl get pods -n kube-system
# 檢視node是否ready
$. kubectl get nodes
# 節點監控
# 檢視pod資源,類似于docker中的容器,確定傳回的資訊都是running
# “-n kube-system”:是k8s的名稱空間
$. kubectl get pod -n kube-system
$. watch kubectl get pod -n kube-system -o wide
7、部署Dashboard
Dashboard是官方提供的一個UI,可用于基本管理K8s資源。
7.1 YAML下載下傳位址:
$. wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
7.2 配置Dashboard
預設Dashboard隻能叢集内部通路,修改Service為NodePort類型,暴露到外部:
$. vi recommended.yaml
...
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 30001
selector:
k8s-app: kubernetes-dashboard
type: NodePort # 修改Service為NodePort類型
...
$. kubectl apply -f recommended.yaml
$. kubectl get pods -n kubernetes-dashboard
7.3 通路 Dashboard
通路位址:https://NodeIP:30001
7.4 Dashboard賬戶管理
建立service account并綁定預設cluster-admin管理者叢集角色:
# 1.建立使用者
$. kubectl create serviceaccount dashboard-admin -n kube-system
# 2.使用者授權
$. kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 3.擷取使用者Token
$. kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
7.5 登入Dashboard
使用輸出的token登入Dashboard。
8、使用kubectl指令行進行服務管理
8.1 建立demo yaml檔案
編寫檔案a.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 2
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: registry.alauda.cn/yubang/paas_base_test
ports:
- containerPort: 80
command: ["/bin/bash", "/var/start.sh"]
resources:
limits:
cpu: 0.5
memory: 64Mi
編寫檔案b.yaml
apiVersion: v1
kind: Service
metadata:
name: my-app-svc
labels:
app: my-app
spec:
ports:
- port: 80
targetPort: 80
nodePort: 30964
type: NodePort
selector:
app: my-app
8.2建立服務
$. kubectl create -f a.yaml --validate
$. kubectl create -f b.yaml --validate
8.3 删除服務
$. kubectl delete-f a.yaml
$. kubectl delete-f b.yaml
8.4增加子節點
安裝軟體(以docker容器運作時為例):
yum-config-manager --add-repo https://docs.docker.com/v1.13/engine/installation/linux/repo_files/centos/docker.repo
yum makecache fast
yum -y install docker-engine-1.13.1
yum install epel-release -y
yum remove-y docker-engine*
yum install -y kubernetes docker flannel
修改配置檔案(10.135.163.237為主節點ip,139.199.0.29為目前節點ip):
sed -i "s/--hostname-override=127.0.0.1/--hostname-override=139.199.0.29/g" /etc/kubernetes/kubelet
sed -i "s/127.0.0.1:8080/10.135.163.237:8080/g" /etc/kubernetes/kubelet
sed -i "s/--address=127.0.0.1/--address=0.0.0.0/g" /etc/kubernetes/kubelet
sed -i "s/127.0.0.1:8080/10.135.163.237:8080/g" /etc/kubernetes/config
sed -i "s/127.0.0.1:2379/10.135.163.237:2379/g" /etc/sysconfig/flanneld
sed -i "s/--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota/--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota/g" /etc/kubernetes/apiserver
8.5 啟動服務(docker示例)
$. service docker start
for SERVICES in kube-proxy kubelet docker flanneld; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done;
8.6 主伺服器檢視節點
$. kubectl get node
8.7 重新開機服務(重新加入叢集)
$. systemctl restart kube-apiserver.service
8.8 删除節點
$. kubectl delete node 節點ip