參考官網:https://kubernetes.io/zh/docs/concepts/workloads/pods/
1.Pod 怎樣管理多個容器
Pod (就像在鯨魚莢或者豌豆莢中)是一組(一個或多個)容器容器是可移植、可執行的輕量級的鏡像,鏡像中包含軟件及其相關依賴。(例如 Docker 容器),這些容器共享存儲、網絡、以及怎樣運行這些容器的聲明。Pod 中的內容總是並置(colocated)的並且一同調度,在共享的上下文中運行。
Pod 所建模的是特定於應用的“邏輯主機”,其中包含一個或多個應用容器,這些容器是相對緊密的耦合在一起 — 在容器出現之前,在相同的物理機或虛擬機上運行意味着在相同的邏輯主機上運行。
Pod 怎樣管理多個容器:
Pod 被設計成支持形成內聚服務單元的多個協作過程(作爲容器)。Pod 中的容器被自動的安排到集羣中的同一物理或虛擬機上,並可以一起進行調度。容器可以共享資源和依賴、彼此通信、協調何時以及何種方式終止它們。
Pod 爲其組成容器提供了兩種共享資源:網絡 和 存儲。
網絡:
每個 Pod 分配一個唯一的 IP 地址。Pod 中的每個容器共享網絡命名空間,包括 IP 地址和網絡端口。Pod 內的容器 可以使用 localhost 互相通信。當 Pod 中的容器與 Pod 之外 的實體通信時,它們必須協調如何使用共享的網絡資源(例如端口)。存儲一個 Pod 可以指定一組共享存儲捲包含可被 Pod 中容器訪問的數據的目錄。
存儲:
Pod 中的所有容器都可以訪問共享卷,允許這些容器共享數據。卷還允許 Pod 中的持久數據保留下來,以防其中的容器需要重新啓動。
2.Pod的生命週期
就緒檢測準備好之後纔可以被外部service暴露
2.1 init容器
官網參考:https://kubernetes.io/zh/docs/concepts/workloads/pods/init-containers/
Pod 可以包含多個容器,應用運行在這些容器裏面,同時 Pod 也可以有一個或多個先於應用容器啓動的Init 容器。
Init 容器的特點:
• 它們總是運行到完成。
• Init 容器不支持 Readiness,因爲它們必須在 Pod 就緒之前運行完成。
• 每個 Init 容器必須運行成功,下一個才能夠運行。
如果 Pod 的 Init 容器失敗,Kubernetes 會不斷地重啓該 Pod,直到 Init 容 器成功爲止。然而,如果 Pod 對應的 restartPolicy 值爲 Never,它不會重新啓動。
Init 容器的工作
因爲 Init 容器具有與應用容器分離的單獨鏡像,其啓動相關代碼具有如下優勢:
• Init 容器可以包含一些安裝過程中應用容器中不存在的實用工具或個性化 代碼。
• Init 容器可以安全地運行這些工具,避免這些工具導致應用鏡像的安全性 降低。
• 應用鏡像的創建者和部署者可以各自獨立工作,而沒有必要聯合構建一個 單獨的應用鏡像。
• Init 容器能以不同於Pod內應用容器的文件系統視圖運行。因此,Init容器 可具有訪問 Secrets 的權限,而應用容器不能夠訪問。
• 由於 Init 容器必須在應用容器啓動之前運行完成,因此 Init 容器提供了一 種機制來阻塞或延遲應用容器的啓動,直到滿足了一組先決條件。一旦前 置條件滿足,Pod內的所有的應用容器會並行啓動。
1.創建Init容器
示例一
下面的例子定義了一個具有 2 個 Init 容器的簡單 Pod。 第一個等待 myservice 啓動,第二個等待 mydb 啓動。 一旦這兩個 Init容器 都啓動完成,Pod 將啓動spec區域中的應用容器。
[kubeadm@server1 mainfest]$ vim init.yml
[kubeadm@server1 mainfest]$ cat init.yml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:latest
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:latest
command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busybox:latest
command: ['sh', '-c', "until nslookup mydb.default.svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
下面的 yaml 文件展示了 mydb 和 myservice 兩個 Service:
[kubeadm@server1 mainfest]$ vim service.yml
[kubeadm@server1 mainfest]$ cat service.yml
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
---
kind: Service
apiVersion: v1
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9377
一旦我們啓動了 mydb 和 myservice 這兩個 Service,我們能夠看到 Init 容器完成,並且 myapp-pod 被創建,隨後my-app的Pod轉移進入 Running 狀態
示例二
[kubeadm@server1 mainfest]$ cat init.yml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: myapp:v1
initContainers:
- name: init-myservice
image: busyboxplus
command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
[kubeadm@server1 mainfest]$ kubectl apply -f init.yml
pod/myapp-pod created
[kubeadm@server1 mainfest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/1 0 3s
[kubeadm@server1 mainfest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/1 0 5s
[kubeadm@server1 mainfest]$ kubectl describe pod myapp-pod
Name: myapp-pod
Namespace: default
Priority: 0
Node: server3/172.25.1.3
Start Time: Tue, 23 Jun 2020 00:18:16 +0800
Labels: app=myapp
Annotations: Status: Pending
IP: 10.244.2.33
IPs:
IP: 10.244.2.33
Init Containers:
init-myservice:
Container ID: docker://b875962d0c3f6c9c116b10c4a8f0ac18985ce3cc7189abd74f62a49b71b81f16
Image: busyboxplus
Image ID: docker-pullable://busyboxplus@sha256:ef538eae80f40015736f1ee308d74b4f38f74e978c65522ce64abdf8c8c5e0d6
Port: <none>
Host Port: <none>
Command:
sh
-c
until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done
State: Running
Started: Tue, 23 Jun 2020 00:18:17 +0800
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-5qqxc (ro)
Containers:
myapp-container:
Container ID:
Image: myapp:v1
Image ID:
Port: <none>
Host Port: <none>
State: Waiting
Reason: PodInitializing
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-5qqxc (ro)
Conditions:
Type Status
Initialized False
Ready False
ContainersReady False
PodScheduled True
Volumes:
default-token-5qqxc:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-5qqxc
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 15s default-scheduler Successfully assigned default/myapp-pod to server3
Normal Pulling 14s kubelet, server3 Pulling image "busyboxplus"
Normal Pulled 14s kubelet, server3 Successfully pulled image "busyboxplus"
Normal Created 14s kubelet, server3 Created container init-myservice
Normal Started 14s kubelet, server3 Started container init-myservice
[kubeadm@server1 mainfest]$ vim service.yml
[kubeadm@server1 mainfest]$ cat service.yml
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
[kubeadm@server1 mainfest]$ kubectl apply -f service.yml
service/myservice created
[kubeadm@server1 mainfest]$ kubectl get pod -w
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/1 0 5m11s
myapp-pod 0/1 PodInitializing 0 5m19s
myapp-pod 1/1 Running 0 5m20s
init容器完成之後普通容器才能開始正常啓動
2.2 探針
探針:
• ExecAction:在容器內執行指定命令。如果命令退出時返回碼爲 0 則認 爲診斷成功。
• TCPSocketAction:對指定端口上的容器的 IP 地址進行 TCP 檢查。如果 端口打開,則診斷被認爲是成功的。
• HTTPGetAction:對指定的端口和路徑上的容器的 IP 地址執行 HTTP Get 請求。如果響應的狀態碼大於等於200 且小於400,則診斷被認爲是成功的。
探測結果:
• 成功:容器通過了診斷。
• 失敗:容器未通過診斷。
• 未知:診斷失敗,因此不會採取任何行動。
Kubelet 可以選擇是否執行在容器上運行的三種探針執行和做出反應:
• livenessProbe:指示容器是否正在運行。如果存活探測失敗,則 kubelet 會殺死容器,並且容器將受到其 重啓策略 的影響。如果容器不提供存活探 針,則默認狀態爲 Success。
• readinessProbe:指示容器是否準備好服務請求。如果就緒探測失敗,端 點控制器將從與 Pod 匹配的所有 Service 的端點中刪除該 Pod 的 IP 地址。 初始延遲之前的就緒狀態默認爲 Failure。如果容器不提供就緒探針,則默 認狀態爲 Success。
• startupProbe: 指示容器中的應用是否已經啓動。如果提供了啓動探測 (startup probe),則禁用所有其他探測,直到它成功爲止。如果啓動探測 失敗,kubelet 將殺死容器,容器服從其重啓策略進行重啓。如果容器沒有 提供啓動探測,則默認狀態爲成功Success。
該什麼時候使用存活(liveness)和就緒(readiness)探針?
如果容器中的進程能夠在遇到問題或不健康的情況下自行崩潰,則不一定需要存活探針; kubelet 將根據 Pod 的restartPolicy 自動執行正確的操作。
如果希望容器在探測失敗時被殺死並重新啓動,那麼指定一個存活探針,並指定restartPolicy 爲 Always 或 OnFailure。
如果要僅在探測成功時纔開始向 Pod 發送流量,請指定就緒探針。在這種情況下,就緒探針可能與存活探針相同,但是 spec 中的就緒探針的存在意味着 Pod 將在沒有接收到任何流量的情況下啓動,並且只有在探針探測成功後纔開始接收流量。
如果希望容器能夠自行維護,可以指定一個就緒探針,該探針檢查與存活探針不同的端點。請注意,如果只想在 Pod 被刪除時能夠排除請求,則不一定需要使用就緒探針;在刪除 Pod 時,Pod 會自動將自身置於未完成狀態,無論就緒探針是否存在。當等待 Pod 中的容器停止時,Pod 仍處於未完成狀態。
重啓策略
PodSpec 中有一個 restartPolicy 字段,可能的值爲 Always、OnFailure 和 Never。默認爲 Always。
Pod 的生命
一般Pod 不會消失,直到人爲銷燬他們,這可能是一個人或控制器。
建議創建適當的控制器來創建 Pod,而不是直接自己創建 Pod。因爲單獨的 Pod 在機器故障的情況下沒有辦法自動復原,而控制器卻可以。
三種可用的控制器:
• 使用 Job 運行預期會終止的 Pod,例如批量計算。Job 僅適用於重啓策略 爲 OnFailure 或 Never 的 Pod。
• 對預期不會終止的 Pod 使用 ReplicationController、ReplicaSet 和 Deployment ,例如 Web 服務器。 ReplicationController 僅適用於具 有 restartPolicy 爲 Always 的 Pod。
• 提供特定於機器的系統服務,使用 DaemonSet 爲每臺機器運行一個 Pod 。
1.存活探針示例
[kubeadm@server1 mainfest]$ vim init.yml
[kubeadm@server1 mainfest]$ cat init.yml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: myapp:v1
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
containers:
- name: myapp-container
image: myapp:v1
imagePullPolicy: IfNotPresent
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 1
periodSeconds: 2
timeoutSeconds: 1
[kubeadm@server1 mainfest]$ cat service.yml
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
[kubeadm@server1 mainfest]$ kubectl apply -f init.yml
pod/myapp-pod created
[kubeadm@server1 mainfest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/1 0 3m35s
[kubeadm@server1 mainfest]$ kubectl apply -f service.yml
service/myservice created
[kubeadm@server1 mainfest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/1 0 3m46s
[kubeadm@server1 mainfest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/1 0 3m54s
[kubeadm@server1 mainfest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/1 0 4m
[kubeadm@server1 mainfest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 4m13s
[kubeadm@server1 mainfest]$ kubectl describe pod myapp-pod
Name: myapp-pod
Namespace: default
Priority: 0
Node: server3/172.25.1.3
Start Time: Tue, 23 Jun 2020 01:09:33 +0800
Labels: app=myapp
Annotations: Status: Running
IP: 10.244.2.34
IPs:
IP: 10.244.2.34
Init Containers:
init-myservice:
Container ID: docker://fc21c78635243d0e9dd380a4330707b21d4eb21d8bf42f33455d7f5c5822d312
Image: busybox:1.28
Image ID: docker-pullable://busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47
Port: <none>
Host Port: <none>
Command:
sh
-c
until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done
State: Terminated
Reason: Completed
Exit Code: 0
Started: Tue, 23 Jun 2020 01:09:51 +0800
Finished: Tue, 23 Jun 2020 01:13:36 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-5qqxc (ro)
Containers:
myapp-container:
Container ID: docker://c09ad11fdf89f84510191f3828348de203317eeabf887f2199cdb8d513990f22
Image: myapp:v1
Image ID: docker-pullable://myapp@sha256:9eeca44ba2d410e54fccc54cbe9c021802aa8b9836a0bcf3d3229354e4c8870e
Port: <none>
Host Port: <none>
State: Running
Started: Tue, 23 Jun 2020 01:13:36 +0800
Ready: True
Restart Count: 0
Liveness: tcp-socket :80 delay=1s timeout=1s period=2s #success=1 #failure=3
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-5qqxc (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-5qqxc:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-5qqxc
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 4m38s default-scheduler Successfully assigned default/myapp-pod to server3
Normal Pulling 4m37s kubelet, server3 Pulling image "busybox:1.28"
Normal Pulled 4m20s kubelet, server3 Successfully pulled image "busybox:1.28"
Normal Created 4m20s kubelet, server3 Created container init-myservice
Normal Started 4m20s kubelet, server3 Started container init-myservice
Normal Pulled 35s kubelet, server3 Container image "myapp:v1" already present on machine
Normal Created 35s kubelet, server3 Created container myapp-container
Normal Started 35s kubelet, server3 Started container myapp-container
[kubeadm@server1 mainfest]$ kubectl exec -it myapp-pod -- sh
/ # nginx -s stop
2020/06/22 17:17:15 [notice] 12#12: signal process started
/ # command terminated with exit code 137
[kubeadm@server1 mainfest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 1 7m46s
[kubeadm@server1 mainfest]$ kubectl exec -it myapp-pod -- sh
/ # nginx -s stop
2020/06/22 17:17:29 [notice] 12#12: signal process started
/ # command terminated with exit code 137
[kubeadm@server1 mainfest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 CrashLoopBackOff 1 8m4s
[kubeadm@server1 mainfest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 2 8m13s
注意:前提是restartPolicy是always
2.就緒探針示例
示例一:
[kubeadm@server1 mainfest]$ vim pod.yml
[kubeadm@server1 mainfest]$ cat pod.yml
apiVersion: v1
kind: Pod
metadata:
name: myapp
labels:
app: myapp
spec:
containers:
- name: myappv1
image: myapp:v1
resources:
requests:
memory: 100Mi
cpu: 0.1
limits:
memory: 200Mi
cpu: 0.2
nodeSelector:
kubernetes.io/hostname: server3
[kubeadm@server1 mainfest]$ kubectl apply -f pod.yml
pod/myapp created
[kubeadm@server1 mainfest]$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myapp 1/1 Running 0 3s app=myapp
[kubeadm@server1 mainfest]$ vim service.yml
[kubeadm@server1 mainfest]$ cat service.yml
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
selector:
app: myapp
[kubeadm@server1 mainfest]$ kubectl apply -f service.yml
service/myservice configured
[kubeadm@server1 mainfest]$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d23h
myservice ClusterIP 10.110.113.147 <none> 80/TCP 3d1h
[kubeadm@server1 mainfest]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp 1/1 Running 0 80s 10.244.2.37 server3 <none> <none>
[kubeadm@server1 mainfest]$ kubectl describe svc myservice
Name: myservice
Namespace: default
Labels: <none>
Annotations: Selector: app=myapp
Type: ClusterIP
IP: 10.110.113.147
Port: <unset> 80/TCP
TargetPort: 9376/TCP
Endpoints: 10.244.2.37:9376
Session Affinity: None
Events: <none>
示例二
[kubeadm@server1 mainfest]$ vim init.yml
[kubeadm@server1 mainfest]$ cat init.yml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: myapp:v1
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
containers:
- name: myapp-container
image: myapp:v1
imagePullPolicy: IfNotPresent
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 1
periodSeconds: 2
timeoutSeconds: 1
readinessProbe:
httpGet:
path: /hostname.html
port: 80
initialDelaySeconds: 1
periodSeconds: 3
timeoutSeconds: 1
[kubeadm@server1 mainfest]$ kubectl apply -f init.yml
pod/myapp-pod created
[kubeadm@server1 mainfest]$ cat service.yml
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
selector:
app: myapp
[kubeadm@server1 mainfest]$ kubectl apply -f service.yml
service/myservice unchanged
[kubeadm@server1 mainfest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 32s
[kubeadm@server1 mainfest]$ kubectl exec -it myapp-pod -- sh
/ # cd /etc/nginx/conf.d/
/etc/nginx/conf.d # ls
default.conf
/etc/nginx/conf.d # vi default.conf
/etc/nginx/conf.d # nginx -s reload
2020/06/25 19:22:43 [notice] 14#14: signal process started
/etc/nginx/conf.d # ps ax
PID USER TIME COMMAND
1 root 0:00 nginx: master process nginx -g daemon off;
7 root 0:00 sh
15 nginx 0:00 nginx: worker process
16 root 0:00 ps ax
/etc/nginx/conf.d # [kubeadm
[kubeadm@server1 mainfest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Running 0 4m11s
[kubeadm@server1 mainfest]$ kubectl describe svc myservice
Name: myservice
Namespace: default
Labels: <none>
Annotations: Selector: app=myapp
Type: ClusterIP
IP: 10.110.113.147
Port: <unset> 80/TCP
TargetPort: 9376/TCP
Endpoints:
Session Affinity: None
Events: <none>
[kubeadm@server1 mainfest]$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
myapp-pod 0/1 Running 0 8m46s app=myapp
[kubeadm@server1 mainfest]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-pod 0/1 Running 0 10m 10.244.1.27 server2 <none> <none>
[kubeadm@server1 mainfest]$ kubectl run demo --image=busyboxplus -it --restart=Never
If you don't see a command prompt, try pressing enter.
[ root@demo:/ ]$ curl 10.244.1.27
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[ root@demo:/ ]$ curl 10.244.1.27/hostname.html
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.12.2</center>
</body>
</html>
[ root@demo:/ ]$ [kubeadm@server1 mainfest]$
取消註釋重新加載會恢復就緒狀態
[kubeadm@server1 mainfest]$ cat service.yml
kind: Service
apiVersion: v1
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: myapp
[kubeadm@server1 mainfest]$ cat pod2.yml
apiVersion: apps/v1
kind: Deployment
metadata:
# Unique key of the Deployment instance
name: deployment-example
spec:
# 3 Pods should exist at all times.
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
# Apply this label to pods and default
# the Deployment label selector to this value
app: myapp
spec:
containers:
- name: myapp
# Run this image
image: myapp:v2
[kubeadm@server1 mainfest]$ kubectl apply -f service.yml
service/myservice created
[kubeadm@server1 mainfest]$ vim pod2.yml
[kubeadm@server1 mainfest]$ kubectl apply -f pod2.yml
deployment.apps/deployment-example unchanged
[kubeadm@server1 mainfest]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
deployment-example-67764dd8bd-rbl7v 1/1 Running 0 5m47s
deployment-example-67764dd8bd-shwvk 1/1 Running 0 5m47s
myapp-pod 1/1 Running 0 2m35s
[kubeadm@server1 mainfest]$ kubectl describe svc myservice
Name: myservice
Namespace: default
Labels: <none>
Annotations: Selector: app=myapp
Type: ClusterIP
IP: 10.110.155.170
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.28:80,10.244.2.41:80,10.244.2.43:80
Session Affinity: None
Events: <none>
[kubeadm@server1 mainfest]$ kubectl run demo --image=busyboxplus -it --restart=Never
If you don't see a command prompt, try pressing enter.
[ root@demo:/ ]$ curl 10.110.155.170
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[ root@demo:/ ]$ curl 10.110.155.170
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
[ root@demo:/ ]$ curl 10.110.155.170
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
[ root@demo:/ ]$ curl 10.110.155.170
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[ root@demo:/ ]$ curl 10.110.155.170
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
[ root@demo:/ ]$ curl 10.110.155.170
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>