[root@master ~]# kubectl run --help Create and run a particular image, possibly replicated. Creates a deployment or job to manage the created container(s). Usage: kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] -- [COMMAND] [args...] [options]
使用以下命令:html
[root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 --dry-run=true deployment.apps/nginx-deploy created (dry run) [root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 deployment.apps/nginx-deploy created [root@master ~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deploy 1 1 1 1 7s [root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE nginx-deploy-5b595999-nzlmj 1/1 Running 0 1m 10.244.2.14 node02 <none>
建立了一個名爲 nginx-deploy
的deployment,副本設置爲1, 查看pod,發現生成了一個nginx的pod,且該pod運行在node02上,ip爲 10.244.2.14
,檢查node02的網絡node
[root@node02 ~]# ip a|grep -A5 cni0 5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP qlen 1000 link/ether 0a:58:0a:f4:02:01 brd ff:ff:ff:ff:ff:ff inet 10.244.2.1/24 scope global cni0 valid_lft forever preferred_lft forever inet6 fe80::980e:b1ff:fee7:a26f/64 scope link valid_lft forever preferred_lft forever 8: veth23ea238e@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP link/ether 32:26:f6:cb:a0:9f brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::3026:f6ff:fecb:a09f/64 scope link valid_lft forever preferred_lft forever
能夠發現,pod是跑在cni網橋上的。nginx
Pod此時能夠在節點端經過Pod ip訪問。json
當咱們刪除這個pod後,Deployment會從新建立一個pod,該pod的ip就會變化。windows
[root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE nginx-deploy-5b595999-nzlmj 1/1 Running 0 1m 10.244.2.14 node02 <none> [root@master ~]# kubectl delete pod nginx-deploy-5b595999-nzlmj pod "nginx-deploy-5b595999-nzlmj" deleted [root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE nginx-deploy-5b595999-z76bn 1/1 Running 0 4s 10.244.1.16 node01 <none>
因此,咱們使用pod ip或pod hostname訪問是不合適的,咱們須要提供一個固定ip及端口。service能夠知足要求。後端
用法瀏覽器
[root@master ~]# kubectl expose --help Expose a resource as a new Kubernetes service. Usage: kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type] [options]
建立service網絡
[root@master ~]# kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP service/nginx exposed [root@master ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8h nginx ClusterIP 10.101.41.108 <none> 80/TCP 7s
如今,咱們就能夠在節點上經過ip 10.101.41.108 訪問。在節點外部沒法訪問。app
這類地址,更多時候是被pod客戶端訪問的。ide
咱們建立一個pod客戶端,來測試:
[root@master ~]# kubectl run client --image=busybox --replicas=1 -it --restart=Never If you don't see a command prompt, try pressing enter. / # cat /etc/resolv.conf nameserver 10.96.0.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5 / #
查看pod的dns解析,發現nameserver是 10.96.0.10
。這個ip是coredns的service ip。
[root@master ~]# kubectl get svc -n kube-system -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 9h k8s-app=kube-dns
此時,在busybox這個pod裏,咱們能夠直接經過service name nginx
訪問以前建立的service,而不是service的ip:port。
# busybox裏 / # wget nginx Connecting to nginx (10.101.41.108:80) index.html 100% |**************************************************************************************| 612 0:00:00 ETA / # wget -O - -q http://nginx:80 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style>
注意: 10.101.41.108是nginx的service的ip。
此時,咱們人爲將nginx的pod搞掛。
[root@master ~]# kubectl delete pod nginx-deploy-5b595999-z76bn pod "nginx-deploy-5b595999-z76bn" deleted [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE client 1/1 Running 0 8m nginx-deploy-5b595999-j6p8g 1/1 Running 0 4s
再次在busybox裏面訪問nginx
# busybox裏 / # wget -O - -q http://nginx:80 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style>
nginx依舊能夠訪問。
能夠經過以下命令,獲取service後端的pod ip
[root@master ~]# kubectl describe service nginx Name: nginx Namespace: default Labels: run=nginx-deploy Annotations: <none> Selector: run=nginx-deploy Type: ClusterIP IP: 10.101.41.108 Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: 10.244.2.17:80 Session Affinity: None Events: <none>
咱們建立一個 myapp
的deployment
[root@master ~]# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2 deployment.apps/myapp created [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE client 1/1 Running 0 17m myapp-848b5b879b-4dz7h 1/1 Running 0 7s myapp-848b5b879b-wjktr 1/1 Running 0 7s nginx-deploy-5b595999-j6p8g 1/1 Running 0 8m [root@master ~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE myapp 2 2 2 2 28s nginx-deploy 1 1 1 1 38m
建立一個 myapp-svc
的service
[root@master ~]# kubectl expose deployment myapp --name=myapp-svc --port=80 service/myapp-svc exposed [root@master ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h myapp-svc ClusterIP 10.105.155.237 <none> 80/TCP 7s nginx ClusterIP 10.101.41.108 <none> 80/TCP 28m
這時候,在busybox pod裏能夠經過myapp-svc來訪問
# busybox pod裏 # 10.244.1.17是pod的ip / # wget -O - -q 10.244.1.17 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> / # wget -O - -q myapp-svc Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
/ # while true; do wget -O - -q myapp-svc/hostname.html; sleep 1;done myapp-848b5b879b-wjktr myapp-848b5b879b-wjktr myapp-848b5b879b-4dz7h myapp-848b5b879b-wjktr myapp-848b5b879b-4dz7h myapp-848b5b879b-4dz7h
能夠發現,後端的pod會有兩個。
將deployment myapp的副本修改成5個。
[root@master ~]# kubectl scale --replicas=5 deployment myapp deployment.extensions/myapp scaled [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE client 1/1 Running 0 24m myapp-848b5b879b-28crc 1/1 Running 0 6s myapp-848b5b879b-4dz7h 1/1 Running 0 7m myapp-848b5b879b-9dp4m 1/1 Running 0 6s myapp-848b5b879b-g4pzd 1/1 Running 0 6s myapp-848b5b879b-wjktr 1/1 Running 0 7m nginx-deploy-5b595999-j6p8g 1/1 Running 0 16m
此時,在busybox pod裏訪問:
/ # while true; do wget -O - -q myapp-svc/hostname.html; sleep 1;done myapp-848b5b879b-g4pzd # 1 myapp-848b5b879b-9dp4m # 2 myapp-848b5b879b-9dp4m myapp-848b5b879b-wjktr # 3 myapp-848b5b879b-28crc # 4 myapp-848b5b879b-4dz7h # 5 myapp-848b5b879b-28crc myapp-848b5b879b-4dz7h
縮減爲3個
[root@master ~]# kubectl scale --replicas=3 deployment myapp deployment.extensions/myapp scaled [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE client 1/1 Running 0 26m myapp-848b5b879b-28crc 0/1 Terminating 0 2m myapp-848b5b879b-4dz7h 1/1 Running 0 9m myapp-848b5b879b-9dp4m 1/1 Running 0 2m myapp-848b5b879b-g4pzd 0/1 Terminating 0 2m myapp-848b5b879b-wjktr 1/1 Running 0 9m nginx-deploy-5b595999-j6p8g 1/1 Running 0 18m
如今更新pod的鏡像
## 鏡像的具體信息能夠經過kubectl describe pod pod_name獲取 [root@master ~]# kubectset image deployment myapp myapp=ikubernetes/myapp:v2 deployment.extensions/myapp image updated [root@master ~]# kubectl rollout status deployment myapp Waiting for deployment "myapp" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "myapp" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "myapp" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "myapp" rollout to finish: 4 of 5 updated replicas are available... deployment "myapp" successfully rolled out
在busybox pod上觀察
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
能夠發現,會有一段時間v1和v2版本會共存,後續更新完畢後,全部pod版本都會變爲v2版本。
master節點上執行undo
[root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE client 1/1 Running 0 34m myapp-74c94dcb8c-5hflp 1/1 Running 0 3m myapp-74c94dcb8c-6klpb 1/1 Running 0 3m myapp-74c94dcb8c-gsrbj 1/1 Running 0 3m myapp-74c94dcb8c-jfzzr 1/1 Running 0 3m myapp-74c94dcb8c-p55sz 1/1 Running 0 3m nginx-deploy-5b595999-j6p8g 1/1 Running 0 26m [root@master ~]# kubectl rollout undo deployment myapp deployment.extensions/myapp [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE client 1/1 Running 0 36m myapp-848b5b879b-5bvtk 1/1 Running 0 34s myapp-848b5b879b-8dh6r 1/1 Running 0 33s myapp-848b5b879b-dzsxq 1/1 Running 0 35s myapp-848b5b879b-gbrqg 1/1 Running 0 35s myapp-848b5b879b-vh4l9 1/1 Running 0 35s nginx-deploy-5b595999-j6p8g 1/1 Running 0 28m
能夠發現myapp的pod所有改變了。去busybox pod中查看:
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
自動擴縮容: 依賴資源使用狀態。
修改svc myapp-svc
kubectl edit svc myapp-svc # 將type: ClusterIP修改成 type: NodePort
以後,查看svc
[root@master ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h myapp-svc NodePort 10.105.155.237 <none> 80:30724/TCP 24m nginx ClusterIP 10.101.41.108 <none> 80/TCP 53m
發現myapp-svc綁定了30724端口。
在windows瀏覽器訪問url nodeIP:30724 發現是能夠訪問的(未截圖)
使用任意node的ip都可
[root@master ~]# while true; do wget -O - -q 192.168.18.128:30724; sleep 0.3;done Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> ^C [root@master ~]# while true; do wget -O - -q 192.168.18.129:30724; sleep 0.3;done Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> ^C [root@master ~]# while true; do wget -O - -q 192.168.18.130:30724; sleep 0.3;done Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>