kubeadm部署一主兩從的kubernetes叢集

T1YSL發表於2022-05-18

kubernetes叢集大體上分為兩類:一主多從和多主多從。

一主多從:一臺Master節點和多型Node節點,搭建簡單,但是有單機故障風險,適合用於測試環境
多主多從:多臺Master節點和多型Node節點,搭建麻煩,適合用於生產環境

本文采用kubeadm部署一主兩從的kubernetes叢集,供測試使用,幷包含了網路外掛和一個簡單nginx服務部署的例子

一、禁用swap分割槽

swapoff -a

swap分割槽指的是虛擬記憶體分割槽,它的作用是在實體記憶體使用完畢後,將磁碟空間虛擬成記憶體來使用
啟動swap裝置會對系統的效能產生非常負面的影響,這裡把swap分割槽關閉

vim /etc/fstab

註釋掉最後一行
image.png

二、安裝docker(三個節點)

1.切換映象源

wget 

image.png

2.檢視前映象源中支援的docker版本

yum list docker-ce --showduplicates

3.安裝指定版本docker(帶上–setopt=obsoletes=0,使用指定版本)

yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y

4.新增配置檔案

Docker在預設情況下使用的Cgroup Driver為cgroupfs,而kubernetes推薦使用systemd來代替cgroupfs

mkdir /etc/docker
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["]
}
EOF

image.png

5.啟動docker

systemctl restart docker
systemctl enable docker

image.png

三、安裝kubernetes元件(三個節點)

1.配置映象源

vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=
       

image.png

2.安裝指定版本的kubeadm,kubelet和kubectl

yum install --setopt=obsoletes=0 kubeadm-1.23.6-0 kubelet-1.23.6-0 kubectl-1.23.6-0 -y

3.修改/etc/sysconfig/kubelet的內容,將裡邊內容替換

vim /etc/sysconfig/kubelet
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

image.png

4.設定kubelet開機自啟

systemctl enable kubelet

四、準備叢集映象

這步是為第五步的kubeadm init做準備,因為init會拉取映象,而此映象在kubernetes的倉庫中,由於網路原因,無法連線,因此用如下方法

vim ima.sh

新增內容

images=(
    kube-apiserver:v1.23.6
    kube-controller-manager:v1.23.6
    kube-scheduler:v1.23.6
    kube-proxy:v1.23.6
    pause:3.6
    etcd:3.5.1-0
    coredns:v1.8.6
)
 
for list in ${images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$list
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$list k8s.gcr.io/$list
done
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6
sh ima.sh

image.png

五、叢集初始化(主節點)

1.主節點建立叢集

kubeadm init \
	--kubernetes-version=v1.23.6 \
	--pod-network-cidr=10.0.0.0/16 \
	--service-cidr=10.0.0.0/12 \
	--apiserver-advertise-address=172.20.10.6

image.png
image.png

記錄下最後結尾的幾個命令

image.png

如果初始化失敗了,使用如下命令清理環境,並重新初始化
kubeadm reset
rm -rf $HOME/.kube
systemctl restart kubelet

2.建立必要檔案

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

六、備機初始化

使用kubeadm init 結尾提示的kubeadm join語句初始化備機,如果忘記kubeadm join語句可以透過如下命令在主節點獲取join命令引數:

kubeadm token create --print-join-command

image.png

在兩個備機執行改語句,加入叢集,結果如下:

image.png
提示在control-plane執行kubectl get nodes檢視節點狀態,即在主節點執行,發現節點的status都是NotReady的狀態,這是因為沒有安裝網路外掛的原因。

kubectl get nodes

image.png

七、安裝網路外掛——calico

kubernetes支援多種網路外掛,比如flannel、calica、canal等等,任選一種使用即可,本次選擇calico。
網路外掛沒有安裝的話,節點是  NotReady 狀態,因為CoreDNS沒有網路外掛分配不到IP地址,會一直處於Pending狀態
如果沒有這個外掛,kubedns無法啟動,pod之間就無法通訊。
只在主節點執行即可,外掛使用的是DaemonSet的控制器,它會在每個節點上都執行。

1.獲取配置檔案並apply

curl -O
image.png

2.檢視服務狀態,都是running了

image.png

再次檢視節點狀態,發現所有的節點都是  Ready 的狀態了
image.png

八、部署CoreDNS

git clone 
yum -y install epel-release
yum -y install jq
cd deployment/kubernetes/
./deploy.sh -i 10.0.0.254 > coredns.yaml
kubectl apply -f coredns.yaml

用命令檢視狀態,發現pod處於ContainerCreating狀態

kubectl get pod,svc -A

image.png
使用kubectl describe檢視該coredns的pod,發現在拉取coredns的映象,稍微等待一會。

kubectl describe pod coredns-799bc9dbc6-m7q4t -n kube-system

image.png
等待一會後檢視events,發現終於拉取成功了
image.png
檢視pod和svc狀態,都是running的

kubectl get pod,svc -A

image.png

九、kubernetes-dashboard的部署

1.獲取yaml檔案

wget 

2.增加配置,使Dashboard暴露到外部

vim recommended.yaml

因為預設Dashboard只能叢集內部訪問,修改Service為NodePort型別,暴露到外部

image.png

3.apply修改後的recommended.yaml

kubectl apply -f recommended.yaml

image.png

4.檢視kubernetes-dashboard的pod狀態,都已經是running的

kubectl get pods -n kubernetes-dashboard

image.png

5.訪問網址


我的主節點地址為172.20.10.6,因此訪問
image.png

6.建立service account並繫結預設cluster-admin管理員叢集角色:

建立使用者

kubectl create serviceaccount dashboard-admin -n kube-system

使用者授權

kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

獲取使用者Token

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

image.png

7.使用輸出的token登入Dashboard。

image.png
可以檢視當前k8s的相關資訊,例如nodes,namespace等
image.png

image.png

十、使用k8s簡單部署一個nginx

1.根據yaml建立namespace

vim nginx-namespace.yaml
內容如下
apiVersion: v1 #型別為Namespace
kind: Namespace  #型別為Namespace
metadata:
  name: ns-test  #名稱空間名稱
  labels:
    name: label-test  #pod標籤

建立namespace

[root@pg01 ~]# kubectl create -f nginx-namespace.yaml
namespace/ns-test created

查詢namespace

[root@pg01 ~]# kubectl get namespace
NAME                   STATUS   AGE
default                Active   92m
kube-node-lease        Active   92m
kube-public            Active   92m
kube-system            Active   92m
kubernetes-dashboard   Active   21m
ns-test                Active   5s

2.建立pod

一般不直接create pod,而是透過controller來建立pod。deployment為其中一種controller

拉取nginx映象

docker pull nginx

編輯pod的yaml檔案

vim nginx-deployment.yaml

內容如下

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: ns-test
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

建立

kubectl create -f nginx-deployment.yaml

查詢

kubectl get pods -n ns-test
kubectl get deployment  -n ns-test

image.png
nginx-deployment 部署的2個 pod 全部成功

檢視兩個nginx分配的ip

kubectl get pods -o wide -n ns-test

image.png

訪問測試

curl 

image.png

3.建立service

建立對應yaml檔案

vim nginx-service.yaml

內容如下

apiVersion: v1
kind: Service
metadata:
  namespace: ns-test
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

建立service

kubectl create -f nginx-service.yaml	

檢視service

kubectl get svc nginx-service -o wide  -n ns-tes

image.png

訪問測試
image.png

4.暴露埠部署nginx服務

nginx-service.yaml檔案如下

apiVersion: v1
kind: Service
metadata:
  labels:
   app: nginx
  name: nginx-service
  namespace: ns-test
spec:
  ports:
  - port: 9000
    name: nginx-service
    protocol: TCP
    targetPort: 80 # 容器nginx對外開放的埠 上面的dm已經指定了
    nodePort: 31090 #外網訪問的埠
  selector:
    app: nginx
  type: NodePort

部署服務

kubectl create -f nginx-service.yaml

檢視服務和埠

kubectl get svc nginx-service -n ns-test

測試如下
image.png

瀏覽器用主節點所在的ip訪問k8s的nginx,我的主節點ip為172.20.10.6,則訪問,結果如下
image.png


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2895114/,如需轉載,請註明出處,否則將追究法律責任。

相關文章