『壹』 企業級k8s集群部署
二進制包
註:推薦用二進制包部署Kubernetes集群,雖手動部署麻煩,但可以學習很多工作原理利於後期維護。
環境
可以使用VMware虛擬機,宿主機必須8G內存以上
• 伺服器可以訪問外網,有從網上拉取鏡像的需求
單Master伺服器規劃:( 註:部署時候根據具體環境進行IP地址調整即可 )
這里使用3台組建集群,可容忍1台機器故障,當然,你也可以使用5台組建集群
etcd1: 192.168.3.110 etcd2: 192.168.3.112 etcd3: 192.168.3.113
cfssl是一個開源的證書管理工具,使用json文件生成證書,相比openssl更方便使用。
找任意一台伺服器操作,這里用Master節點。
創建工作目錄:
自簽CA:
生成證書:
會生成ca.pem和ca-key.pem文件。
創建證書申請文件:
註:上述文件hosts欄位中IP為所有etcd節點的集群內部通信IP,一個都不能少!為了方便後期擴容可以多寫幾個預留的IP。
生成證書:
會生成etcd.pem和春陵讓etcd-key.pem文件。
https://github.com/etcd-io/etcd/releases/download/v3.5.1/ etcd-v3.5.1-linux-amd64.tar.gz
以下在節點1上操作,然後將文件拷貝到其他集群機器
把剛才生成的證書拷貝到配置文件中的路徑:
注意修改節點2和節點3分別etcd.conf配置,按照下面提示的修改
啟動各節點的etcd服務
如果輸出上面信息,就說明集群部署成功。
如果有問題看日誌:/var/log/message
docker二進制下載地址:
https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz
註:使用yum安裝也行
集群所有機器都安裝docker
生成證扒局書:
會生成ca.pem和ca-key.pem文件。
創建證書申請文件:
生成證書:
會生成k8s.pem和k8s-key.pem文件。
下載地汪陸址參考:
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md#downloads-for-v12013
Wget https://dl.k8s.io/v1.20.13/kubernetes-server-linux-amd64.tar.gz
把剛才生成的證書拷貝到配置文件中的路徑:
TLS Bootstrapping 機制,對work-node加入進行自簽證書用
創建上述配置文件中token文件:
token 可以自行生產,網路下怎麼生產
kube-apiserver服務
生成kube-controller-manager證書:
生成kubeconfig文件(以下是shell命令,直接在終端執行):
生成kube-scheler證書:
生成kubeconfig文件:
生成kubeconfig文件:
通過kubectl工具查看當前集群組件狀態:
在所有worker node創建工作目錄:
從master節點拷貝:
註:由於網路插件還沒有部署,節點會沒有準備就緒 NotReady
二進制包下載地址:https://github.com/containernetworking/plugins/releases
確保kubelet啟用CNI:
在Master執行:
應用場景:例如kubectl logs
在Master節點將Worker Node涉及文件拷貝到新節點192.168.3.112/113
註:這幾個文件是證書申請審批後自動生成的,每個Node不同,必須刪除
Node2(192.168.3.113 )節點同上。記得修改主機名!
訪問地址:https://NodeIP:30001
創建service account並綁定默認cluster-admin管理員集群角色:
使用輸出的token登錄Dashboard。
CoreDNS用於集群內部Service名稱解析。
DNS解析測試:
這樣 單Master集群就搭建完成了
『貳』 k8s一個pod載入多個containers,指定pod運行的node
問題描述
Kubernetes有著自己特定的調度演算法與策略信咐,有Master中的Scheler組件來實現,根據Node資源使用情況自動調度Pod的創建,通常可以滿足我們大部分的需求。但是有時我們希望可以將某些Pod調度到特定硬體節點上,這里採用目前最為簡單的nodeName和nodeSelector來實現Pod調度。
假設以下場景:有三個Node,分別為滑梁純107、108、109,創建Deployments來部署Tomcat應用,指定在107節點上創建Pod。
解決方案
nodeName
Pod.spec.nodeName將Pod直接調度到指定的Node節點上,會跳過Scheler的調度策略,該匹配規則是強制匹配。
Tomcatl.yaml文件
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: myweb
spec:
replicas: 2
template:
metadata:
labels:
app: myweb
spec:
nodeSelector: 107 #直接通過節點名稱調度到指定節點
containers:
- name: myweb
image: harbor/tomcat:8.5-jre8
ports:
- containerPort: 80
nodeSelector
Pod.spec.nodeSelector通過kubernetes的label-selector機制選擇節點,由調度器調度策略匹配label,而後渣賣調度Pod到目標節點,該匹配規則屬於強制約束。
設置 Node Lable
kubectl label nodes 107 type=backEndNode1
1
Tomcatl.yaml文件
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: myweb
spec:
replicas: 2
template:
metadata:
labels:
app: myweb
spec:
nodeSelector:
type: backEndNode1
containers:
- name: myweb
image: harbor/tomcat:8.5-jre8
ports:
- containerPort: 80
創建Deployment
kubectl create -f Tomcat.yaml
『叄』 k8s安裝部署
K8s集群搭建毀灶
1 centos版本信息查看
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
k8s集群機器關閉防火牆
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
2 安裝必要的源余豎包
k8s集群安裝以雹大下安裝包
[root@k8s-node ~]# yum -y install net-tools wget vim ntpd
[root@k8s-node ~]# systemctl enable ntpd
[root@k8s-node ~]# systemctl start ntpd
3配置hosts
[root@k8s-node ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.248.141 k8s-master
192.168.248.142 k8s-node
4 部署master節點
4.1 Master節點安裝必要的安裝包
[root@k8s-master ~]# yum -y install etcd
4.2更改/etc/etcd/etcd.conf配置文件
[root@k8s-master etcd]# cat /etc/etcd/etcd.conf | grep -v "^#"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
ETCD_NAME="master"
ETCD_ADVERTISE_CLIENT_URLS= http://k8s-master:2379,http://k8s-master:4001
4.3設置開機啟動並驗證狀態
[root@k8s-master ~]#systemctl enable etcd
[root@k8s-master ~]#systemctl start etcd
etcd檢查
[root@k8s_master ~]# etcdctl -C http://k8s-master:4001 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://k8s_master:2379 cluster is healthy
[root@k8s_master ~]# etcdctl -C http://k8s-master:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://k8s_master:2379 cluster is healthy
5 安裝部署docker環境(略)
6 安裝kubernetes
[root@k8s_master ~]# yum install kubernetes
安裝過程中報錯如下
Error: docker-ce conflicts with 2:docker-1.13.1-75.git8633870.el7.centos.x86_64
可以執行如下命令解決
1、查看安裝過的docker:yum list installed | grep docker
2、卸載docker:yum remove -y docker-ce.x86_64 0:18.03.0.ce-1.el7.centos
3、刪除容器鏡像:rm -rf /var/lib/docker
再次安裝kubernetes,安裝成功,而且會自動安裝docker
6.1修改apiserver服務的配置文件
[root@k8s-master kubernetes]# cat /etc/kubernetes/apiserver | grep -v "^#"
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.248.141:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS=""
6.2修改config配置文件:
[root@k8s-master kubernetes]# cat /etc/kubernetes/config | grep -v "^#"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.248.141:8080"
設置開機啟動,開啟服務
[root@k8s-master ~]#systemctl enable kube-apiserver kube-controller-manager kube-scheler docker
[root@k8s-master ~]#systemctl start kube-apiserver kube-controller-manager kube-scheler docker
6.3查看服務埠:
[root@k8s-master ~]# netstat –tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1273/master
tcp 0 0 127.0.0.1:2380 0.0.0.0:* LISTEN 2126/etcd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 571/rpcbind
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1362/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 998/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 996/cupsd
tcp6 0 0 ::1:25 :::* LISTEN 1273/master
tcp6 0 0 :::4001 :::* LISTEN 2126/etcd
tcp6 0 0 :::6443 :::* LISTEN 3216/kube-apiserver
tcp6 0 0 :::10251 :::* LISTEN 3222/kube-scheler
tcp6 0 0 :::2379 :::* LISTEN 2126/etcd
tcp6 0 0 :::10252 :::* LISTEN 3221/kube-controlle
tcp6 0 0 :::111 :::* LISTEN 571/rpcbind
tcp6 0 0 :::8080 :::* LISTEN 3216/kube-apiserver
tcp6 0 0 :::22 :::* LISTEN 998/sshd
tcp6 0 0 ::1:631 :::* LISTEN 996/cupsd
7部署node節點
7.1安裝docker(略)安裝k8s(略)
7.2 Node節點主機做以下配置:
修改config配置文件
[root@k8s-node kubernetes]# cat /etc/kubernetes/config | grep -v "^#"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.248.141:8080"
修改kubelet配置文件
[root@k8s-node kubernetes]# cat /etc/kubernetes/kubelet | grep -v "^#"
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=192.168.248.142"
KUBELET_API_SERVER="--api-servers=http://192.168.248.141:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""
設置開機啟動、開啟服務
[root@k8s_client1 ~]# systemctl enable kubelet kube-proxy
[root@k8s_client1 ~]# systemctl start kubelet kube-proxy
查看埠:
[root@k8s_client1 ~]# netstat –ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1277/master
tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 3246/kubelet
tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 3133/kube-proxy
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 575/rpcbind
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1332/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1000/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 998/cupsd
tcp6 0 0 ::1:25 :::* LISTEN 1277/master
tcp6 0 0 :::4194 :::* LISTEN 3246/kubelet
tcp6 0 0 :::10250 :::* LISTEN 3246/kubelet
tcp6 0 0 :::10255 :::* LISTEN 3246/kubelet
tcp6 0 0 :::111 :::* LISTEN 575/rpcbind
tcp6 0 0 :::22 :::* LISTEN 1000/sshd
tcp6 0 0 ::1:631 :::* LISTEN 998/cupsd
Master上查看集群中的節點及節點狀態
[root@k8s-master kubernetes]# kubectl get node
NAME STATUS AGE
192.168.248.142 Ready 2m
[root@k8s-master kubernetes]# kubectl -s http://k8s-master:8080 get node
NAME STATUS AGE
192.168.248.142 Ready 2m
kubernetes集群搭建完成。
在k8s集群中創建pod,如果出現如下錯誤
其中最主要的問題是:details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)
解決方案:
查看/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt (該鏈接就是上圖中的說明) 是一個軟鏈接,但是鏈接過去後並沒有真實的/etc/rhsm,所以需要使用yum安裝:
yum install *rhsm*
安裝完成後,執行一下docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
如果依然報錯,可參考下面的方案:
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
注釋:rpm2cpio命令用於將rpm軟體包轉換為cpio格式的文件
cpio命令主要是用來建立或者還原備份檔的工具程序,cpio命令可以復制文件到歸檔包中,或者從歸檔包中復文件。
-i 還原備份檔
-v 詳細顯示指令的執行過程
這兩個命令會生成/etc/rhsm/ca/redhat-uep.pem文件.
[root@k8s-node ~]# docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
在master節點新建pod並查看起狀態為正常
flannel是CoreOS提供用於解決Dokcer集群跨主機通訊的覆蓋網路工具。它的主要思路是:預先留出一個網段,每個主機使用其中一部分,然後每個容器被分配不同的ip;讓所有的容器認為大家在同一個直連的網路,底層通過UDP/VxLAN等進行報文的封裝和轉發。
『肆』 k8s添加/刪除節點
一,准備新設備,新建一台虛機,盡量和其他階段保持一致(ubantu20要知道固定ip)
二,按照搭建手冊准備節點的前置條件
ubantu20.10 搭建部署k8s v1.20.0集群步驟
sudo apt install -y nfs-common cifs-utils
三,添加新節點到集群
1,生成token
kubeadm token list #token如果沒有就巧迅是過期了 要重新生成
kubeadm token create
2,獲取ca
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/卜搜dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
3,孝弊此添加集群,需要加入的節點上執行
kubeadm join 192.168.0.153:6443 --token ajbh7x.sqm1fgfkqt9etn5l --discovery-token-ca-cert-hash sha256:
刪除節點
1,卸載節點(drain 翻譯排出,此時卸載節點,但是沒有刪除)
kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
2,刪除節點
kubectl delete node <node name>
3,清空init配置,需要刪除的節點上執行
kubeadm reset
『伍』 K8s系統部署kubelet服務
kubelet 是在每個 Node 節點上運行的主要 「節點代理」。它可以使用以下之一向 apiserver 注冊: 主機名(hostname);覆蓋主機名的參數;某雲驅動的特定邏輯。
kubelet 是基於 PodSpec 來工作的。每個 PodSpec 是一個描述 Pod 的 YAML 或 JSON 對象。 kubelet 接受通過各種機制(主要是通過 apiserver)提供的一組 PodSpec,並確保這些 PodSpec 中描述的容器處於運行狀態且運行狀況良好。 kubelet 不管理不是由 Kubernetes 創建的容器。
在hdss01-221.host.com和hdss01-222.host.com:主機上操作:
簽發kubelet證書:
在運維主機hdss01-200.host.com上:
創建生成證書簽名請求(csr)的json配置文件:
hosts:要把使用和可能使用的ip地址都寫上。( 一定要先規劃好 )
~]# cd /opt/certs/
certs]# vi kubelet-csr.json
{
"CN": "k8s-kubelet",
"hosts": [
"127.0.0.1",
"10.41.1.210",
"10.41.1.221",
"10.41.1.222",
"10.41.1.223",
"10.41.1.224",
"10.41.1.225",
"10.41.1.226",
"10.41.1.227",
"10.41.1.228"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "henan",
"L": "zhengzhou",
"O": "jx",
"OU": "xxzx"
}
]
}
certs]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server kubelet-csr.json |cfssl-json -bare kubelet
把證書復制到運算節點hdss01-221.host.com和hdss01-222.host.com上:
cd /opt/kubernetes/server/bin/cert
scp hdss01-200:/opt/certs/kubelet.pem .
scp hdss01-200:/opt/certs/kubelet-key.pem
創建配置kubelet.kubeconfig:
只做一次,最後生成的 kubelet.kubeconfig 拷貝至其他節點
conf]# cd /opt/kubernetes/server/bin/conf
set-cluster:
kubectl config set-cluster myk8s
--certificate-authority=/opt/kubernetes/server/bin/cert/ca.pem
--embed-certs=true
--server=https://10.41.1.210:7443
--kubeconfig=kubelet.kubeconfig
set-credentials:
kubectl config set-credentials k8s-node
--client-certificate=/opt/kubernetes/server/bin/cert/client.pem
--client-key=/opt/kubernetes/server/bin/cert/client-key.pem
--embed-certs=true
--kubeconfig=kubelet.kubeconfig
set-context:
kubectl config set-context myk8s-context
--cluster=myk8s
--user=k8s-node
--kubeconfig=kubelet.kubeconfig
use-context:
kubectl config use-context myk8s-context --kubeconfig=kubelet.kubeconfig
創建資源配置文件(給用戶k8s-node授予許可權):
conf]# cat /opt/kubernetes/server/bin/conf/k8s-node.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: k8s-node
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:node
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: k8s-node
conf]# kubectl create -f k8s-node.yaml
conf]# kubectl get clusterrolebinding k8s-node -o yaml
在hdss01-222.host.com上:
cert]# cd /opt/kubernetes/server/bin/conf
conf]# scp hdss01-221:/opt/kubernetes/server/bin/conf/kubelet.kubeconfig .
准備pause基礎鏡像:
在運維主機hdss01-200.host.com上操作:
下載鏡像:
certs]# docker pull kubernetes/pause
給鏡像打tag
certs]# docker tag f9d5de079539 harbor.od.com/public/pause:latest
上傳到私有庫:
certs]# docker push harbor.od.com/public/pause:latest
創建kubelet啟動腳本:
hdss01-221.host.com上:
cat /opt/kubernetes/server/bin/kubelet.sh
#!/bin/sh
./kubelet
--anonymous-auth=false
--cgroup-driver systemd
--cluster-dns 192.168.0.2
--cluster-domain cluster.local
--runtime-cgroups=/systemd/system.slice
--kubelet-cgroups=/systemd/system.slice
--fail-swap-on="false"
--client-ca-file ./cert/ca.pem
--tls-cert-file ./cert/kubelet.pem
--tls-private-key-file ./cert/kubelet-key.pem
--hostname-override hdss01-221.host.com #hdss01-222做相應的更改 hdss01-222.host.com
--image-gc-high-threshold 20
--image-gc-low-threshold 10
--kubeconfig ./conf/kubelet.kubeconfig
--log-dir /data/logs/kubernetes/kube-kubelet
--pod-infra-container-image harbor.od.com/public/pause:latest
--root-dir /data/kubelet
bin]# chmod +x kubelet.sh
bin]# mkdir -p /data/logs/kubernetes/kube-kubelet /data/kubelet
創建supervisor配置:
hdss01-221.host.com上:
bin]# cat /etc/supervisord.d/kube-kubelet.ini
[program:kube-kubelet-01-221] #hdss01-222.host.com上修改改為22
command=/opt/kubernetes/server/bin/kubelet.sh ; the program (relative uses PATH, can take args)
numprocs=1 ; number of processes copies to start (def 1)
directory=/opt/kubernetes/server/bin ; directory to cwd to before exec (def no cwd)
autostart=true ; start at supervisord start (default: true)
autorestart=true ; retstart at unexpected quit (default: true)
startsecs=30 ; number of secs prog must stay running (def. 1)
startretries=3 ; max # of serial start failures (default 3)
exitcodes=0,2 ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT ; signal used to kill process (default TERM)
stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
user=root ; setuid to this UNIX account to run the program
redirect_stderr=true ; redirect proc stderr to stdout (default false)
stdout_logfile=/data/logs/kubernetes/kube-kubelet/kubelet.stdout.log ; stderr log path, NONE for none; default AUTO
stdout_logfile_maxbytes=64MB ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=4 ; # of stdout logfile backups (default 10)
stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
stdout_events_enabled=false ; emit events on stdout writes (default false)
bin]# supervisorctl update
bin]# supervisorctl status
bin]# kubectl get nodes
ROlES添加標簽,設定節點角色,可同時加兩個標簽
bin]#kubectl label node hdss01-221.host.com node-role.kubernetes.io/master=
bin]# kubectl label node hdss01-221.host.com node-role.kubernetes.io/node=
bin]#kubectl label node hdss01-222.host.com node-role.kubernetes.io/node=
bin]# kubectl label node hdss01-222.host.com node-role.kubernetes.io/master=
『陸』 k8s:將pod部署到指定的node運行(pod&node選擇部署策略)
查看所有節點labels:
添加labels:
修改yaml配置文件:
添加nodeSelector配置,樣式為[label.key]: [label.value]
修改後重啟服務
參考文章: https://blog.csdn.net/lzy__yuan/article/details/106913428
nodeSelector配置相對簡單,k8s提供了另外一個pod調度配置: nodeAffinity(節點親和) ,相對於nodeSelector的簡單匹配他擁有更多更加個殲枯性化的配置。
這段配氏喚洞置表示:該pod可以被調度到標簽key為 "deploy.type" ,值為 "yztssjdxt-test" 或 "yztssjdxt" 的節點。
通過使用的語句不同,調度分成軟策略(soft)和硬策略(hard) ,在軟策略下,如果沒有滿足調度條件的節點,pod會忽略這條規則,繼續完成調度。而硬策略下,pod必須部署到滿足條件的節點上,如果沒有滿足條件的節點,就不停重試。
DuringScheling和IgnoredDuringExecution組合生成目前主要的nodeaffinity策略
軟硬策略可以組合使用 ,如下面這段配鏈仿置中pod必須被調度到標簽為 "deploy.type=yztssjdxt-test" 的節點。另外,在滿足該條件的節點中,優先使用具有 "server=oms" 標簽的節點。
nodeAffinity中nodeSelector欄位下,節點滿足任何一個條件即可;但更下一級matchExpressions,節點必須同時滿足所有條件才能運行pod 。
如下面這段配置需要deploy.type=yztssjdxt-test、server=oms同時滿足
而這段配置只需要deploy.type=yztssjdxt-test、deploy.type1=yztssjdxt滿足一個即可
operator欄位 :pod與node的匹配邏輯,可選的操作符有:(我只測過in、notin)
如下方這段配置,pod將不會調度到deploy.type=yztssjdxt-test的node上
『柒』 k8s deploy 部署在哪個node
k8s將pod部署到指定的咐租消node運行(pod&node選擇部署策略)。
_odeSelector配置相對簡單,k8s提型運供了另外一個pod調度配置:nodeAffinity(節點親衡知和),相對於nodeSelector的簡單匹配他擁有更多更加個性化的配置。
『捌』 k8s系列02-kubeadm部署flannel網路的k8s集群
本文主要在centos7系統上基於 docker 和 flannel 組件部署 v1.23.6 版本的k8s原生集群,由於集群主要用於自己平時學習和測試使用,加上資源有限,暫不涉及高可擾輪用部署。
此前寫的一些關於k8s基礎知識和集群搭建的一些 方案 ,有需要的同學可以看一下。
機器均為8C8G的虛擬機,硬碟為100G。
同一個k8s集群內的所有節點需要確保 mac 地址和 proct_uuid 均唯一,開始集群初始化之前需要檢查相關信息
如果k8s集群的節點有多個網卡,確保每個節點能通過正確的網卡互聯訪問
這里可以根據自己的習慣選擇ntp或者是chrony同步均可,同步的時間源伺服器可以選擇阿里雲的 ntp1.aliyun.com 或者是國家時間中心的 ntp.ntsc.ac.cn 。
k8s集群之間通信和服務暴露需要使用較多埠,為了方便,直接禁用防火牆
這里主要是需要配置內核載入 br_netfilter 和 iptables 放行 ipv6 和 ipv4 的流量,確保集群內的容器能夠正常通信。
雖然新版本的k8s已經支持雙棧網路,但是本次的集群部署過程並不涉及IPv6網路的通信,因此關閉IPv6網路支持
IPVS是專門設計用來應對負載均衡場景的組件, kube-proxy 中的 IPVS 實現 通過減少對 iptables 的使用來增加可擴展性。在 iptables 輸入鏈中不使用 PREROUTING,而是創建一個假的介面,叫做 kube-ipvs0,雀櫻當k8s集群中的負載均衡配置變多的時候,IPVS能實現比iptables更高效的轉發性能。
詳細的官方文檔可以參考 這里 ,由於在剛發布的1.24版本中移除了 docker-shim ,因此安裝的 版本≥1.24 的時候需要注意 容器運行時 的選擇。這里我們安裝的版本低於1.24,因此我們繼續使用docker。
docker的具體安裝可以參考我之前寫的 這篇文章 ,這里不做贅述。
CentOS7使用的是 systemd 來初始化系統並管理進程,初始化進程會生成並使用一個 root 控制組 ( cgroup ), 並充當 cgroup 管理器。 Systemd 與 cgroup 集成緊密,並將為每個 systemd 單元分配一個 cgroup 。 我們也可以配置 容緩歲信器運行時 和 kubelet 使用 cgroupfs 。 連同 systemd 一起使用 cgroupfs 意味著將有兩個不同的 cgroup 管理器 。而當一個系統中同時存在cgroupfs和systemd兩者時,容易變得不穩定,因此最好更改設置,令容器運行時和 kubelet 使用 systemd 作為 cgroup 驅動,以此使系統更為穩定。 對於 Docker, 需要設置 native.cgroupdriver=systemd 參數。
k8s官方有 詳細的文檔 介紹了如何設置kubelet的 cgroup driver ,需要特別注意的是,在1.22版本開始,如果沒有手動設置kubelet的cgroup driver,那麼默認會設置為systemd
一個比較簡單的指定kubelet的 cgroup driver 的方法就是在 kubeadm-config.yaml 加入 cgroupDriver 欄位
我們可以直接查看configmaps來查看初始化之後集群的kubeadm-config配置。
當然因為我們需要安裝的版本高於1.22.0並且使用的就是systemd,因此可以不用再重復配置。
kube三件套就是 kubeadm 、 kubelet 和 kubectl ,三者的具體功能和作用如下:
需要注意的是:
CentOS7的安裝比較簡單,我們直接使用官方提供的 yum 源即可。需要注意的是這里需要設置 selinux 的狀態,但是前面我們已經關閉了selinux,因此這里略過這步。
在集群中所有節點都執行完上面的三點操作之後,我們就可以開始創建k8s集群了。因為我們這次不涉及高可用部署,因此初始化的時候直接在我們的目標master節點上面操作即可。
此時我們再查看對應的配置文件中的鏡像版本,就會發現已經變成了對應阿里雲鏡像源的版本
當我們看到下面這個輸出結果的時候,我們的集群就算是初始化成功了。
剛初始化成功之後,我們還沒辦法馬上查看k8s集群信息,需要配置kubeconfig相關參數才能正常使用kubectl連接apiserver讀取集群信息。
配置完成後,我們再執行相關命令就可以查看集群的信息了。
這時候我們還需要繼續添加剩下的兩個節點作為worker節點運行負載,直接在剩下的節點上面運行集群初始化成功時輸出的命令就可以成功加入集群:
如果不小心沒保存初始化成功的輸出信息也沒有關系,我們可以使用kubectl工具查看或者生成token
添加完成之後我們再查看集群的節點可以發現這時候已經多了兩個node,但是此時節點的狀態還是 NotReady ,接下來就需要部署CNI了。
flannel 應該是眾多開源的CNI插件中入門門檻最低的CNI之一了,部署簡單,原理易懂,且相關的文檔在網路上也非常豐富。
針對 kube-flannel.yml 文件,我們需要修改一些 參數 以適配我們的集群:
修改完成之後我們直接部署即可
集群部署完成之後我們在k8s集群中部署一個nginx測試一下是否能夠正常工作。首先我們創建一個名為 nginx-quic 的命名空間( namespace ),然後在這個命名空間內創建一個名為 nginx-quic-deployment 的 deployment 用來部署pod,最後再創建一個 service 用來暴露服務,這里我們先使用 nodeport 的方式暴露埠方便測試。
部署完成後我們直接查看狀態
最後我們進行測試,這個nginx-quic的鏡像默認情況下會返回在nginx容器中獲得的用戶請求的IP和埠