當前位置:首頁 » 網頁前端 » k8s自動部署腳本
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

k8s自動部署腳本

發布時間: 2023-03-20 07:12:05

1. skywalking—docker鏡像構建k8s部署

前言

skywalking是個非常不錯的apm產帆閉品,但是在使用過程中有個非常蛋疼的問題,在基於es的存儲情況下,es的數據一有問題,就會導致整個skywalking web ui服務不可用,然後需要agent端一個服務一個服虧汪務的停用,然後服務重新部署後好,全部走一遍。這種問題同樣也會存在skywalking的版本升級迭代中。而且apm 這種過程數據是允許丟棄的,默認skywalking中關於trace的數據記錄只保存了90分鍾。故博主准備將skywalking的部署容器化,一鍵部署升級。下文是整個skywalking 容器化部署的過程。

目標:將skywalking的docker鏡像運行在k8s的集群環境中提供服務

docker鏡像構建

FROMregistry.cn-xx.xx.com/keking/jdk:1.8ADDapache-skywalking-apm-incubating/  /opt/apache-skywalking-apm-incubating/RUNln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime \

    && echo 'Asia/Shanghai' >/etc/timezone \

    && chmod +x /opt/apache-skywalking-apm-incubating/config/setApplicationEnv.sh \

    && chmod +x /opt/apache-skywalking-apm-incubating/webapp/setWebAppEnv.sh \

    && chmod +x /opt/apache-skywalking-apm-incubating/bin/startup.sh \

    && echo "tail -fn 100 /opt/apache-skywalking-apm-incubating/logs/webapp.log" >> /opt/apache-skywalking-apm-incubating/bin/startup.shEXPOSE8080 10800 11800 12800CMD/opt/apache-skywalking-apm-incubating/態空裂config/setApplicationEnv.sh \

    && sh /opt/apache-skywalking-apm-incubating/webapp/setWebAppEnv.sh \

    && /opt/apache-skywalking-apm-incubating/bin/startup.sh

在編寫Dockerfile時需要考慮幾個問題:skywalking中哪些配置需要動態配置(運行時設置)?怎麼保證進程一直運行(skywalking 的startup.sh和tomcat中 的startup.sh類似)?

application.yml

#cluster:#  zookeeper:#    hostPort: localhost:2181#    sessionTimeout: 100000naming:jetty:#OS real network IP(binding required), for agent to find collector clusterhost:0.0.0.0port:10800contextPath:/cache:#  guava:caffeine:remote:gRPC:# OS real network IP(binding required), for collector nodes communicate with each other in cluster. collectorN --(gRPC) --> collectorMhost:#real_hostport:11800agent_gRPC:gRPC:#os real network ip(binding required), for agent to uplink data(trace/metrics) to collector. agent--(grpc)--> collectorhost:#real_hostport:11800# Set these two setting to open ssl#sslCertChainFile: $path#sslPrivateKeyFile: $path# Set your own token to active auth#authentication: xxxxxxagent_jetty:jetty:# OS real network IP(binding required), for agent to uplink data(trace/metrics) to collector through HTTP. agent--(HTTP)--> collector# SkyWalking native Java/.Net/node.js agents don't use this.# Open this for other implementor.host:0.0.0.0port:12800contextPath:/analysis_register:default:analysis_jvm:default:analysis_segment_parser:default:bufferFilePath:../buffer/bufferOffsetMaxFileSize:10MbufferSegmentMaxFileSize::trueui:jetty:# Stay in `localhost` if UI starts up in default mode.# Change it to OS real network IP(binding required), if deploy collector in different machine.host:0.0.0.0port:12800contextPath:/storage:elasticsearch:clusterName:#elasticsearch_:trueclusterNodes:#elasticsearch_clusterNodesindexShardsNumber:2indexReplicasNumber:0highPerformanceMode:true# Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.htmlbulkActions:2000# Execute the bulk every 2000 requestsbulkSize:20# flush the bulk every 20mbflushInterval:10# flush the bulk every 10 seconds whatever the number of requestsconcurrentRequests:2# the number of concurrent requests# Set a timeout on metric data. After the timeout has expired, the metric data will automatically be deleted.traceDataTTL:2880# Unit is minuteminuteMetricDataTTL:90# Unit is minutehourMetricDataTTL:36# Unit is hourdayMetricDataTTL:45# Unit is daymonthMetricDataTTL:18# Unit is month#storage:#  h2:#    url: jdbc:h2:~/memorydb#    userName: saconfiguration:default:#namespace: xxxxx# alarm :2000serviceErrorRateThreshold:10.::10.::10.:2000# ::40# max collection's size of worker cache collection, setting it smaller when collector OutOfMemory crashed.workerCacheMaxSize:10000#receiver_zipkin:#  default:#    host: localhost#    port: 9411#    contextPath: /

webapp.yml

動態配置:密碼,grpc等需要綁定主機的ip都需要運行時設置,這里我們在啟動skywalking的startup.sh只之前,先執行了兩個設置配置的腳本,通過k8s在運行時設置的環境變數來替換需要動態配置的參數

setApplicationEnv.sh

#!/usr/bin/env shsed -i"s/#elasticsearch_clusterNodes/${elasticsearch_clusterNodes}/g"/opt/apache-skywalking-apm-incubating/config/application.ymlsed -i"s/#elasticsearch_clusterName/${elasticsearch_clusterName}/g"/opt/apache-skywalking-apm-incubating/config/application.ymlsed -i"s/#real_host/${real_host}/g"/opt/apache-skywalking-apm-incubating/config/application.yml

setWebAppEnv.sh

#!/usr/bin/env shsed -i"s/#skywalking_password/${skywalking_password}/g"/opt/apache-skywalking-apm-incubating/webapp/webapp.ymlsed -i"s/#real_host/${real_host}/g"/opt/apache-skywalking-apm-incubating/webapp/webapp.yml

保持進程存在:通過在skywalking 啟動腳本startup.sh末尾追加"tail -fn 100

/opt/apache-skywalking-apm-incubating/logs/webapp.log",來讓進程保持運行,並不斷輸出webapp.log的日誌

Kubernetes中部署

apiVersion:extensions/v1beta1kind:Deploymentmetadata:name:skywalkingnamespace:uatspec:replicas:1selector:matchLabels:app:skywalkingtemplate:metadata:labels:app:skywalkingspec:imagePullSecrets:-name:registry-pull-secretnodeSelector:apm:skywalkingcontainers:-name:skywalkingimage:registry.cn-xx.xx.com/keking/kk-skywalking:5.2imagePullPolicy:Alwaysenv:-name:elasticsearch_clusterNamevalue:elasticsearch-name:elasticsearch_clusterNodesvalue:172.16.16.129:31300-name:skywalking_passwordvalue:xxx-name:real_hostvalueFrom:fieldRef:fieldPath:status.podIPresources:limits:cpu:1000mmemory:4Girequests:cpu:700mmemory:2Gi---apiVersion:v1kind:Servicemetadata:name:skywalkingnamespace:uatlabels:app:skywalkingspec:selector:app:skywalkingports:-name:web-aport:8080targetPort:8080nodePort:31180-name:web-bport:10800targetPort:10800nodePort:31181-name:web-cport:11800targetPort:11800nodePort:31182-name:web-dport:12800targetPort:12800nodePort:31183type:NodePort

Kubernetes部署腳本中唯一需要注意的就是env中關於pod ip的獲取,skywalking中有幾個ip必須綁定容器的真實ip,這個地方可以通過環境變數設置到容器裡面去

結語

整個skywalking容器化部署從測試到可用大概耗時1天,其中花了個多小時整了下譚兄的skywalking-docker鏡像(

https://hub.docker.com/r/wutang/skywalking-docker/),發現有個腳本有許可權問題(譚兄反饋已解決,還沒來的及測試),以及有幾個地方自己不是很好控制,便build了自己的docker鏡像,其中最大的問題還是解決集群中網路通訊的問題,一開始我把skywalking中的服務ip都設置為0.0.0.0,然後通過集群的nodePort映射出來,這個時候的agent通過集群ip+31181是可以訪問到naming服務的,然後通過naming服務獲取到的collector gRPC服務缺變成了0.0.0.0:11800, 這個地址agent肯定訪問不到collector的,後面通過綁定pod ip的方式解決了這個問題。

2. Jenkins+Rancher自動化部署

本文主要記錄Jenkins+Rancher+k8s自動化部署相關配置說明,不涉及rancher和jenkins安裝部署,包含java server項目、WAR項目、前端VUE項目部署配置介紹。

伺服器環境信息:

需要在安裝jenkins服務上部署下面相應的軟體,請注意軟體版本,如已經安裝相關軟體,可跳過此章節。

需要安裝rancher-cli,並且使用jenkins用戶預先登錄rancher平台:命令參考:

--token:這個用戶的token建議設置為永不過期,在rancher管理端 -> api&key > 添加。

建議安裝阿里鏡像,提高編譯速度:

jenkins啟動用戶需要添加到docker組中:

項目主要是java和vue開發的,所以需要安裝Maven Integration plugin插件。

spring boot或者spring cloud自帶容器,以及其它服務類型的java後端應用部署。

1、填寫項目名稱,選擇"構建一個maven項目"

點擊下面"OK"按鈕

2、填寫項目描述信息

3、輸入項目地址,並選擇用戶憑證

本文通過conding.net作為代碼管理平台,點擊"Add"添加自己賬號憑證(輸入coding.net平台登陸賬號密碼即可)。

4、配置maven編譯腳本

5、編寫rancher部署腳本

Dockerfile參數說明:FROM:選擇基礎鏡像包,該項目是用java語言開發需要jdk1.8所以選擇openjdk:8ADD:將bRule-deploy-1.0.0.tar.gz文件解壓並上傳到鏡像的brule目錄EXPOSE:容器內部啟動2002埠,根據自身項目填寫指定埠,多個埠填寫多行EXPOSE標簽ENTRYPOINT:容器啟動時執行的命令,執行多條命令使用&&拼接,命令行中帶&需要加上轉移符\&,使用tail -fn監聽應用日誌,以便容器日誌查看。

用於創建docker鏡像,就好比創建一個已經安裝並且配置好了應用程序的操作系統鏡像。

參數說明:192.168.100.21:5000:為本地docker鏡像伺服器地址brule:latest:應用名稱,根據自身項目名稱修改

利用上面創建好的操作系統鏡像啟動一個vmware虛擬機,創建k8s容器。

參數說明:brule:應用名稱,根據自身項目名稱修改,應用名稱規范?(.?)*image:剛才創建的docker鏡像containerPort:容器啟動埠,多個埠使用多行containerPort標簽聲明,埠限制在【30000-32000】

前面vmware虛擬機創建好後,怎麼能讓別人訪問?這個時候就需要創建一個網路服務,用於打通路由器與vmware本地虛擬機的網路。

參數說明:brule:應用名稱,根據自身項目名稱修改port:容器啟動埠nodePort:對外提供服務埠,外部機器訪問

將上面配置好的shell腳本復制到Post Steps -> 執行shell文本域中,並點擊"保緩緩緩存" -> "立即構建"即可部署。

1、進入剛才創建好的jenkins任務,點擊立即構建

2、點擊左下角構建任務,選擇"Console Output"哪唯,查看構建日誌

3、登錄rancher管理平台,查看構建好的應用

基於J2EE項目的war包部署,前面操作都一致,只是shell部署腳本稍有不同,這里主要詳細說明rancher部署腳本。

Dockerfile參數說明:FROM:選擇基礎鏡像包,war統一使用tomcat容器部署,tomcat:8.5-jre8-slimADD:將operation.war文件解壓並上傳到鏡像的/usr/local/tomcat/webapps/目錄EXPOSE:容器內部啟動8080埠,根據自身項目填寫指定埠,多個端擾模口填寫多行EXPOSE標簽

這里不需要配置ENTRYPOINT標簽,因為tomcat鏡像包中已經有了。

用於創建docker鏡像,就好比創建一個已經安裝並且配置好了應用程序的操作系統鏡像。

參數說明:192.168.100.21:5000:為本地docker鏡像伺服器地址operation:latest:應用名稱,根據自身項目名稱修改

利用上面創建好的操作系統鏡像啟動一個vmware虛擬機,創建k8s容器。

參數說明:operation:應用名稱,根據自身項目名稱修改image:剛才創建的docker鏡像containerPort:容器啟動埠,多個埠使用多行containerPort標簽聲明,埠限制在【30000-32000】

前面vmware虛擬機創建好後,怎麼能讓別人訪問?這個時候就需要創建一個網路服務,用於打通路由器與vmware本地虛擬機的網路。

參數說明:operation:應用名稱,根據自身項目名稱修改port:容器啟動埠nodePort:對外提供服務埠,外部機器訪問

將上面配置好的shell腳本復制到Post Steps -> 執行shell文本域中,並點擊"保存" -> "立即構建"即可部署。

基於webpack構建的VUE項目部署,前面操作都一致,只是shell部署腳本稍有不同,這里主要詳細說明rancher部署腳本。

Dockerfile參數說明:FROM:選擇基礎鏡像包,前端統一使用tomcat容器部署,tomcat:8.5-jre8-slimCOPY:將/dist目錄上傳到鏡像的/usr/local/tomcat/webapps/fastquery/目錄EXPOSE:容器內部啟動8080埠,根據自身項目填寫指定埠,多個埠填寫多行EXPOSE標簽

這里不需要配置ENTRYPOINT標簽,因為tomcat鏡像包中已經有了。

用於創建docker鏡像,就好比創建一個已經安裝並且配置好了應用程序的操作系統鏡像。

參數說明:192.168.100.21:5000:為本地docker鏡像伺服器地址operation:latest:應用名稱,根據自身項目名稱修改

利用上面創建好的操作系統鏡像啟動一個vmware虛擬機,創建k8s容器。

前面vmware虛擬機創建好後,怎麼能讓別人訪問?這個時候就需要創建一個網路服務,用於打通路由器與vmware本地虛擬機的網路。

參數說明:shutcm-fastquery-web:應用名稱,根據自身項目名稱修改port:容器啟動埠nodePort:對外提供服務埠,外部機器訪問

將上面配置好的shell腳本復制到Post Steps -> 執行shell文本域中,並點擊"保存" -> "立即構建"即可部署。

3. k8s部署springboot項目

環境和前面中 kubeadm 搭建 k8s 的一致

省略創建項目步驟

提供一個 /k8s/hello 介面 接收一個 name 參數,列印並且返回

可以看到 2個 副本pod 已經Running

訪問前 需肆悶要先把 springboot.demo.com 域名添加到 宿主機的 /etc/hosts中 保證可以正常解析到並坦 ingress-nginx那台機器上的nginx 即可 (不詳 可以看上一篇)

請求介面: http://springboot.demo.com/k8s/hello?name=johnny

查看 兩個副本的 日裂蔽彎志,可以看到 Ingress 的默認輪訓負載均衡策略也生效了 ,至此 k8s部署springboot項目已經結束

本篇主要 講解了 k8s 如何部署springboot項目,過程很簡單 ,目前只是半手動部署,後面引入 CICD 實現真正的 自動化部署。

歡迎大家訪問個人博客 : https://www.askajohnny.com

4. Mac部署k8s

官網地址: https://www.docker.com/procts/docker-desktop

1:翻牆問題,Docker Desktop默認去國外拉取鏡像,不能翻牆或者翻牆網速慢的小夥伴只能幹著急。推薦一個開源項目: https://github.com/AliyunContainerService/k8s-for-docker-desktop ,作者提供了一個腳本核帆,將從阿里源拉取鏡像到本地,
2:檢查hosts文件,確定大者是否有硬解析:127.0.0.1 kubernetes.docker.internal
默認會自動加,對於用hosts切換工具的小夥伴來說,需要注意一下,否則就會有滾氏薯一下問題:
dial tcp: lookup kubernetes.docker.internal: no such host

部署 Kubernetes dashboard:

檢查 kubernetes-dashboard 應用狀態:

開啟 API Server 訪問代理:

通過如下 URL 訪問 Kubernetes dashboard:
http://127.0.0.1:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

配置控制台訪問令牌:

5. 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=

6. K8S 應用啟停通用腳本

Kubernetes 集群中缺頃運行的應用中的每一個服務組件通常是以 Deployment 的形式存在的,本文中提供的管理腳本假設讀者部署在 Kubernetes 中的應用服務的 Deployment 對象均已特定的前綴命名,比如 demo,那麼集群中可能存在一下的 Deployment 對象:

在這個前提下,我這里提供了者模一個腳本可以對這些 deployment 對象進行一鍵啟停操作。舉例說明,加絨我的腳本名稱為 k8s-apps.sh 那麼可以執行如下命令:

啟停腳本的內容如下:伏嫌陸

7. k8s的咖啡伴侶 -- 自動化部署工具Drone

剛開始打算用Jenkins+shell 部署鏡像到K8S,無意間看到網上推薦的drone,用了之後覺得drone和docker、K8S非常般配,Jenkins更像上一並慶陸代產品。在這里分享和總結一下drone的使用過程。

目錄結構

通過以上腳本,就實現了自動化部署,drone的功能很簡潔,沒有絕頃一絲多餘,最後放一張部署成功的截圖差信

8. 8. K8s 資源部署

很少在 Kubernetes 中直接創建一個Pod,甚至是單實例(Singleton)的 Pod。 這是因為 Pod 被設計成了相對臨時性的、用後即拋的一次性實體, 不支持高可用 。一般使用工作負載資源來創建和管理多個 Pod。 資源的控制器能夠處理副本的管理、上線,並在 Pod 失效時提供自愈能力。
能夠管理一個或者多個 Pod 的工作負載資源有:

Pod 類似於共享namesapce、cgroup、文件系統卷的一組 Docker 容器。創建Pod時,除了會創建1個或多個工作容器外, 還會額外在Pod中創建Pod容器,Pod容器用於實現k8s的各種功能

查詢基礎信息

查詢詳細信息

查詢Pod的標簽

ReplicationController 確保在任何時候都有特定數量的 Pod 副本處於運行狀態。 換句話說,ReplicationController 確保一個 Pod 或一組同類的 Pod 總是可用的。
RC會根據 spec.selector 將當前已經運行的Pod加入RC,當 Pod 數量過多時,ReplicationController 會終止多餘的 Pod。當 Pod 數量世臘太少時,ReplicationController 將會啟動新的 Pod。

查詢基礎信息

查詢詳細信息

問題:
Pod創建完成後,如何訪問Pod呢?直接訪問Pod會有如下幾個問題:

解決方法:
Kubernetes中的Service對象就是用來解決上述Pod訪問問題的。Service有一個固定IP地址 Cluster IP ,Service將訪問它的流量轉發給Pod,具體轉發給哪些Pod通過Label來選擇,而且Service可以給這些Pod做負載均衡。

Node物理節點的IP地址

Service的IP地址,此為虛擬IP地址。外部網路無法ping通,只有kubernetes集群內部訪問使用。

每個Pod的IP地址

Cluster地址和pod地址在不同網段,Cluster地址為虛擬地址,不配在pod上或主機上,外部訪問時,先到Node節點網路(所有Node開放同一個埠號),再轉到service網路,最後代理冊返兄給pod網路。

Service的類型決定了如何向外暴露Service

通過集群的內部 IP 暴露服務,選擇該值時服務只能夠在集群內部訪問。 這也是默認的 ServiceType。

通過每個節點上的 IP 和靜態埠(NodePort)暴露服務。 NodePort 服務會路由到自動創建的 ClusterIP 服務。 通過請求 <Node節點 IP>:<節點埠>,你可以從集群的外部訪問一個 NodePort 服務。

NodePort類型的Service例子:

Service默認的負載均衡模式是RR輪詢模式,可以通過修改 spec.sessionAffinity 為 ClientIP 來實現源地址會話保持。可以設置會話保持的超時時間(默認時間是10800s),設置 spec.sessionAffinityConfig.clientIP.timeoutSeconds 的值。

Deployment 管州襲理 ReplicaSet,並向 Pod 提供聲明式的更新以及許多其他有用的功能,

首先根據文件創建deployment,加入 --record 參數來記錄歷史,方便在回滾時查看針對每個 Deployment 修訂版本所執行過的命令。

Deployment會創建ReplicaSet,ReplicaSet負責啟動Pods。ReplicaSet 的名稱始終被格式化為 [Deployment名稱]-[隨機字元串] 。 其中的隨機字元串是使用 pod-template-hash 作為種子隨機生成的。

Deployment 控制器每次注意到新的 Deployment 時,都會創建一個 ReplicaSet 以啟動所需的 Pods。 如果更新了 Deployment,則控制標簽匹配 .spec.selector 但模板不匹配 .spec.template 的 Pods 的現有 ReplicaSet 被縮容。最終,新的 ReplicaSet 縮放為 .spec.replicas 個副本, 所有舊 ReplicaSets 縮放為 0 個副本。

當 Deployment 正在上線時被更新,Deployment 會針對更新創建一個新的 ReplicaSet 並開始對其擴容,之前正在被擴容的 ReplicaSet 會被翻轉,添加到舊 ReplicaSets 列表 並開始縮容。

例如,假定你在創建一個 Deployment 以生成 nginx:1.14.2 的 5 個副本,但接下來 更新 Deployment 以創建 5 個 nginx:1.16.1 的副本,而此時只有 3 個nginx:1.14.2 副本已創建。在這種情況下,Deployment 會立即開始殺死 3 個 nginx:1.14.2 Pods, 並開始創建 nginx:1.16.1 Pods。它不會等待 nginx:1.14.2 的 5 個副本都創建完成 後才開始執行變更動作。

升級操作,兩種方式:

Deployment之所以能如此容易的做到回滾,是因為Deployment是通過ReplicaSet控制Pod的,升級後之前ReplicaSet都一直存在,Deployment回滾做的就是使用之前的ReplicaSet再次把Pod創建出來。Deployment中保存ReplicaSet的數量可以使用 revisionHistoryLimit 參數限制,默認值為10。

查看Deployment 修訂歷史

輸出

查看第n次的修訂歷史

輸出

回滾到之前的修訂版本

回滾後,Deployment 修訂歷史發生變化,revision 1變為revision 3

可以在觸發一個或多個更新之前暫停 Deployment,然後再恢復其執行。 這樣做使得你能夠在暫停和恢復執行之間應用多個修補程序,而不會觸發不必要的上線操作。

暫停

恢復

通過檢測容器響應是否正常來決定是否重啟Pod,Kubernetes支持如下三種探測機制:

Liveness Probe在 containers 欄位中定義

為Deployment中的Pod配置Liveness Probe,Probe往容器的80埠發送HTTP GET請求,如果請求不成功,Kubernetes會重啟容器。

在容器中執行 cat /tmp/healthy 命令,如果成功執行並返回 0 ,則說明容器是健康的。