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 ,則說明容器是健康的。