kubeadm部署k8s集群


1  容器編排工具介紹

容器編排三套解決方案

 kubernetes

 mesos+marathon

 machine+swarn+compose

1.1  Docker提供的容器編排方案

docker compose  單主機編排,只能面向一個docker主機進行編排

docker swarm  編排多主機dokcer,整合一個資源池,而后docker compose只需面向資源池進行編排

docker machine 將一個主機迅速初始化為能符合加入docker swarm集群中的先決條件

 

   

1.2  kubernetes編排方案

1)       k8s特性

自動裝箱,自我修復,水平擴展,服務發現和負載均衡,自動發布和回滾,密鑰和配置管理,存儲編排,批量處理運行

2)       k8s原理

用戶把創建、啟動容器的請求發動給master,master中的調度器去分析各nodes現有的可用資源狀態,找一個最佳適配的,nodes本地的docker engine負責啟動起來

3)       Kubernetes組件

master:apiserver, controller-manager, scheduler

nodes: kubelet, kube-proxy, container

附加組件:etcd dashbord等

   4)       邏輯構成:

  • Pod

  label(標簽):key=value

  pod分兩類:

      自主式的Pod

         控制器管理的pod

 

  • pod控制器

           ReplicationController

              ReplicaSet

           Deployment

                     StatefulSet

                     DaemonSet

                     Job

                     CronJob

                     Horizontal Pod Autoscaler(HPA):自動伸縮pod,訪問量猛增,隨時擴大pod

  • service: 管理同一類的pod信息,保存變更pod的信息,提供客戶端訪問
  • CNI

                 flannel:網絡配置

                 calico:網絡配置、網絡策略

                 canel

                 節點網絡、集群網絡、pod網絡

 

                 

 

                 

2   安裝前kubernees環境准備

2.1   搭建Kubernetes集群環境有三種方式

1)       Minikube安裝方式

Minikube是一個工具,可以在本地快速運行一個單點的Kubernetes,嘗試Kubernetes或日常開發的用戶使用。但是這種方式僅可用於學習和測試部署,不能用於生產環境。

https://kubernetes.io/docs/setup/minikube/

2)       Kubeadm安裝方式(本次基於該方式)

kubeadm是一個kubernetes官方提供的快速安裝和初始化擁有最佳實踐(best practice)的kubernetes集群的工具,提供kubeadm init和kubeadm join,用於快速部署Kubernetes集群。目前kubeadm還處於beta 和alpha狀態,不推薦用在生產環境,但是可以通過學習這種部署方法來體會一些官方推薦的kubernetes最佳實踐的設計和思想。

kubeadm的目標是提供一個最小可用的可以通過Kubernetes一致性測試的集群,所以並不會安裝任何除此之外的非必須的addon。kubeadm默認情況下並不會安裝一個網絡解決方案,所以用kubeadm安裝完之后,需要自己來安裝一個網絡的插件。所以說,目前的kubeadm是不能用於生產環境的

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

3)        二進制包安裝方式(生產部署的推薦方式)

從官方下載發行版的二進制包,手動部署每個組件,組成Kubernetes集群,這種方式符合企業生產環境標准的Kubernetes集群環境的安裝,可用於生產方式部署。

https://github.com/kubernetes/kubernetes/releases

https://www.cnblogs.com/kevingrace/category/839227.html  #參考

 

#本次安裝環境

Kubernetes安裝要求:

內核3.10+或4+

docker版本要小於17.03

OS:centos7.4

k8s:v1.20.1

Kubernetes 機器環境:

master, etcd:192.168.100.161

node1:192.168.100.162

node2:192.168.100.163

2.2    環境准備

#配置源、安裝基本軟件

cd /etc/yum.repos.d/

mkdir bak

mv *.repo bak/

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

yum clean all

yum makecache

yum repolist

yum -y install iproute net-tools lrzsz wget ntp* numactl psmisc vim bridge-util

cd

#時間同步

yum -y install chrony

systemctl enable chronyd.service && systemctl  start chronyd.service

sed -i -e '/^server/s/^/#/' -e '1a server ntp.aliyun.com iburst' /etc/chrony.conf

systemctl restart chronyd.service

#關閉防火牆

systemctl stop firewalld.service && systemctl disable firewalld.service

 

#關閉selinux

setenforce 0

sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

cat /etc/selinux/config  | grep -w "SELINUX"

 

#關閉swap

swapoff -a

sed  -i -r '/swap/s/^/#/' /etc/fstab

free -m

#設置時區

timedatectl set-timezone Asia/Shanghai

#配置hosts和修改主機名

cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.100.161 master

192.168.100.162 node01

192.168.100.163 node02

 

#分別修改各主機名

hostnamectl set-hostname master

hostnamectl set-hostname node01

hostnamectl set-hostname node02

 

#修改內核參數

echo "net.bridge.bridge-nf-call-iptables=1" >> /etc/sysctl.conf

echo "net.bridge.bridge-nf-call-ip6tables=1" >> /etc/sysctl.conf

sysctl -p

#如果有如下報錯:

sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory

sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory

解決方法:

安裝bridge-util軟件,加載bridge,br_netfilter模塊

yum install -y bridge-utils.x86_64

modprobe bridge

modprobe br_netfilter

chmod +x /etc/rc.local

echo "modprobe bridge" >>/etc/rc.local

echo "modprobe br_netfilter" >>/etc/rc.local

2.3  配置源、安裝docker和kubeadm

1)       配置docker源

wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2)       配置k8s源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/

enabled=1

gpgcheck=1

repo_gpgcheck=1

gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

EOF

#添加好以后,查看一下

yum -y repolist

3)       安裝docker和kubeadm

yum install -y docker-ce kubelet kubeadm kubectl

systemctl start docker && systemctl enable docker &&systemctl enable kubelet

#kubele設置成開機啟動就行,不用現在啟動

3      安裝k8s (master端操作)

3.1    拉取鏡像

[root@master ~]# kubeadm config images list #獲取鏡像版本

[root@hwsrv-693199 ~]# bash k8s_get_images.sh   #替換下版本號,然后在訪問外網的機器上執行

#!/bin/bash
apiserver=k8s.gcr.io/kube-apiserver:v1.20.2
ctrl_manager=k8s.gcr.io/kube-controller-manager:v1.20.2
scheduler=k8s.gcr.io/kube-scheduler:v1.20.2
proxy=k8s.gcr.io/kube-proxy:v1.20.2
pause=k8s.gcr.io/pause:3.2
etcd=k8s.gcr.io/etcd:3.4.13-0
coredns=k8s.gcr.io/coredns:1.7.0

#下載鏡像
for i in $apiserver $ctrl_manager $scheduler $proxy $pause $etcd $coredns;do docker pull $i;done
#導出鏡像
docker save -o k8s_images.tar.gz $apiserver $ctrl_manager $scheduler $proxy $pause $etcd $coredns
chmod 755 k8s_images.tar.gz
#刪除鏡像
for i in $apiserver $ctrl_manager $scheduler $proxy $pause $etcd $coredns;do docker rmi $i;done

[root@master ~]# docker load <k8s_images.tar.gz  # 3個節點都需要load

3.2    初始化k8s

[root@master ~]# sed -i 's/KUBELET_EXTRA_ARGS=/KUBELET_EXTRA_ARGS="--fail-swap-on=false"/g' /etc/sysconfig/kubelet

[root@master ~]# kubeadm init --image-repository=k8s.gcr.io --kubernetes-version=v1.20.2 --apiserver-advertise-address=192.168.100.161 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap

--image-repository:這個用於指定從什么位置來拉取鏡像(1.13版本才有的),默認值是k8s.gcr.io,我們將其指定為國內鏡像地址:registry.aliyuncs.com/google_containers

--kubernetes-version:指定kubenets版本號,默認值是stable-1,會導致從https://dl.k8s.io/release/stable-1.txt下載最新的版本號,我們可以將其指定為固定版本

--apiserver-advertise-address 指明用 Master 的哪個 interface 與 Cluster 的其他節點通信。如果 Master 有多個 interface,建議明確指定,如果不指定,kubeadm 會自動選擇有默認網關的 interface。

--pod-network-cidr指定 Pod 網絡的范圍。Kubernetes 支持多種網絡方案,而且不同網絡方案對  --pod-network-cidr有自己的要求,這里設置為10.244.0.0/16 是因為我們將使用 flannel 網絡方案,必須設置成這個 CIDR。

  3.3    根據初始化的提示配置kubectl

  mkdir -p $HOME/.kube

  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

  sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

[root@master ~]# kubectl get cs  查看集群狀態

NAME                 STATUS    MESSAGE              ERROR

controller-manager   Healthy   ok                  

scheduler            Healthy   ok                  

etcd-0               Healthy   {"health": "true"}  

#遇到的問題:

注釋掉/etc/kubernetes/manifests下的kube-controller-manager.yaml和kube-scheduler.yaml的- – port=0。

 

[root@master ~]# kubectl get nodes #查看節點信息

NAME                STATUS     ROLES    AGE     VERSION

master.magedu.com   NotReady   master   5m22s   v1.13.4

3.4    安裝pod網絡

1)       安裝Weave網絡

export kubever=$(kubectl version | base64 | tr -d '\n')

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"

2)       查看

 [root@master ~]# docker images  #下載下面兩個鏡像很慢,預計20分鍾

 

 kubectl get pods -A

 

kubectl get nodes  #狀態改變了

 

  #更多pod網絡解決方案,請參考http://docs.kubernetes.org.cn/459.html#34pod

4  node節點加入k8s集群(nodes端操作)

1)       確保node節點上有以下鏡像 ,把master上的拿過來就行了

 

#根據maser上 kubeadmin init執行結果的提示,在2台node上分別執行如下命令

kubeadm join 192.168.100.161:6443 --token 9zx9rt.t95m0qis1iyx85oi \

    --discovery-token-ca-cert-hash sha256:1276e8641c573280371e87249f74d2b65bfcc60e76040ff88bd6c078b7cfaef7

 

2)       master中的節點認證信息24小時會失效,可以用下面方法重新生成

#創建token

[root@master ~]# kubeadm token create

#創建新的sha

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

#加入集群

kubeadm join 172.16.20.102:6443 --token 【token】--discovery-token-ca-cert-hash sha256:【sha值】

5   基本使用

1、在master創建一個myapp的應用,副本數量為3

vim myapp-deploy.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: myapp-deploy

spec:

  replicas: 3

  selector:

    matchLabels:

      app: myapp

  template:

    metadata:

      labels:

        app: myapp

    spec:

      containers:

      - name: myapp

        image: ikubernetes/myapp:v1

        ports:

        - containerPort: 80

          name: http

kubectl apply -f myapp-deploy.yaml

可以通過以下一些命令查看應用的狀態等信息

kubectl get deployment -w

kubectl get pods -o wide

2、service發布應用

kubectl expose deployment myapp-deploy --name=myapp-svc --port 80

kubectl get svc

3、發布應用,外部可以訪問

kubectl edit svc myapp-svc

type: ClusterIP 將 ClusterIP 修改為NodePort

kubectl get svc

在集群外部訪問http://192.168.100.167:32602/

4、擴容myapp應用

kubectl scale --replicas=5 deployment myapp-deploy

kubectl get pod -o wide

5、縮容myapp應用

kubectl scale --replicas=3 deployment myapp-deploy

kubectl get pod -o wide

6、滾動更新

#kubectl set image deployment [控制器名] [容器名]=ikubernetes/myapp:v2

kubectl get deployment -o wide

kubectl set image deployment myapp myapp=ikubernetes/myapp:v2

7、查看滾動更新過程

# kubectl rollout status deployment myapp

8、更新完成后,查看鏡像版本

# kubectl get deployment myapp -o wide

9、回滾

# kubectl rollout undo deployment myapp

10、刪除應用

# kubectl delete deployment myapp

# kubectl delete svc myapp

 

 

 

 

 

 

 

  • 添加到短語集
     
    • 沒有此單詞集:英語 → ...
       
    • 創建新的單詞集...
  • 拷貝
  • 添加到短語集
     
    • 沒有此單詞集:英語 → ...
       
    • 創建新的單詞集...
  • 拷貝


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM