Kubernetes之(五)快速部署应用
目錄
- Kubernetes之(五)快速部署應用
- kubectl命令介紹
- kubectl run命令行部署應用
- kubectl expose 通過service暴漏Pod
- kubectl scale 動態伸縮應用副本
- kubectl set image 應用版本升級
- kubectl rollout 回滾
- 集群外部訪問Service
Kubernetes之(五)快速部署應用
kubectl命令介紹
[root@master ~]# kubectl --help kubectl controls the Kubernetes cluster manager. Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/Basic Commands (Beginner):create Create a resource from a file or from stdin.expose 使用 replication controller, service, deployment 或者 pod 并暴露它作為一個 新的 Kubernetes Servicerun 在集群中運行一個指定的鏡像set 為 objects 設置一個指定的特征Basic Commands (Intermediate):explain 查看資源的文檔get 顯示一個或更多 resourcesedit 在服務器上編輯一個資源delete Delete resources by filenames, stdin,resources and names, or by resources and label selectorDeploy Commands:rollout Manage the rollout of a resourcescale 為 Deployment, ReplicaSet, Replication Controller 或者 Job設置一個新的副本數量autoscale 自動調整一個 Deployment, ReplicaSet, 或者ReplicationController 的副本數量Cluster Management Commands:certificate 修改 certificate 資源.cluster-info 顯示集群信息top Display Resource (CPU/Memory/Storage) usage.cordon 標記 node 為 unschedulableuncordon 標記 node 為 schedulabledrain Drain node in preparation for maintenancetaint 更新一個或者多個 node 上的 taintsTroubleshooting and Debugging Commands:describe 顯示一個指定 resource 或者 group 的 resources 詳情logs 輸出容器在 pod 中的日志attach Attach 到一個運行中的 containerexec 在一個 container 中執行一個命令port-forward Forward one or more local ports to a podproxy 運行一個 proxy 到 Kubernetes API servercp 復制 files 和 directories 到 containers 和從容器中復制 files 和 directories.auth Inspect authorizationAdvanced Commands:diff Diff live version against would-be applied versionapply 通過文件名或標準輸入流(stdin)對資源進行配置patch 使用 strategic merge patch 更新一個資源的 field(s)replace 通過 filename 或者 stdin替換一個資源wait Experimental: Wait for a specific condition on one or many resources.convert 在不同的 API versions 轉換配置文件Settings Commands:label 更新在這個資源上的 labelsannotate 更新一個資源的注解completion Output shell completion code for the specified shell (bash or zsh)Other Commands:api-resources Print the supported API resources on the serverapi-versions Print the supported API versions on the server, in the form of"group/version"config 修改 kubeconfig 文件plugin Provides utilities for interacting with plugins.version 輸出 client 和 server 的版本信息Usage:kubectl [flags] [options]Use "kubectl <command> --help" for more information about a given command. Use "kubectl options" for a list of global command-line options (applies to all commands).kubectl run命令行部署應用
語法:
Usage:kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] -- [COMMAND] [args...] [options]舉例
[root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 --dry-run=true kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead. deployment.apps/nginx-deploy created (dry run) #--image 指定鏡像 #--port 暴漏端口 #--replicas 設置副本數量 # --dry-run=true 干跑模式,不執行,類似驗證,無問題后再執行 [root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 deployment.apps/nginx-deploy created ## 查看是否創建成功 #查看deployment [root@master ~]# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE nginx-deploy 1/1 1 1 30s #查看pod [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deploy-84cbfc56b6-st4tq 1/1 Running 0 72s # -o wide 顯示更多詳細信息 [root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deploy-84cbfc56b6-st4tq 1/1 Running 0 98s 10.244.2.2 node02 <none> <none>從上面創建的應用可以得知,nginx-deploy應用的pod的ip為10.244.2.2,這是一個pod ip,僅僅可以在集群內部訪問,如下:
[root@master ~]# curl -I 10.244.2.2 HTTP/1.1 200 OK Server: nginx/1.14.2 Date: Thu, 28 Mar 2019 02:23:42 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Fri, 08 Mar 2019 03:09:00 GMT Connection: keep-alive ETag: "5c81dccc-264" Accept-Ranges: bytes[root@node01 ~]# curl -I 10.244.2.2 HTTP/1.1 200 OK Server: nginx/1.14.2 Date: Thu, 28 Mar 2019 02:23:48 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Fri, 08 Mar 2019 03:09:00 GMT Connection: keep-alive ETag: "5c81dccc-264" Accept-Ranges: bytes[root@node02 ~]# curl -I 10.244.2.2 HTTP/1.1 200 OK Server: nginx/1.14.2 Date: Thu, 28 Mar 2019 02:23:46 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Fri, 08 Mar 2019 03:09:00 GMT Connection: keep-alive ETag: "5c81dccc-264" Accept-Ranges: bytes嘗試刪除Pod
[root@master ~]# kubectl delete pods nginx-deploy-84cbfc56b6-st4tq pod "nginx-deploy-84cbfc56b6-st4tq" deleted [root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deploy-84cbfc56b6-w66pw 1/1 Running 0 53s 10.244.2.3 node02 <none> <none>可以看到刪除Pod后又重新開起了一個Pod,因為pod是被控制器管理的(此處為deployment),當Pod數量不滿足控制器的desired值得時候,會自動補全Pod(隨機在集群內滿足要求得node節點創建),來滿足期望值,同樣的如果過多也會關掉多余得Pod。
此時Pod得IP已經發生變化,所以如果需要被外部訪問就需要提供一個固定得端點,就是接下來說得Service:
kubectl expose 通過service暴漏Pod
語法
Usage:kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type] [options] #--port=port 這里是服務端口 #--target-port 容器端口 #--type=type service類型,分為Custer IP ,NodePort,LoadBalancer,ExternalName,默認是Custer IP 后面會詳細講解舉例
#將name為nginx-deploy的deployment暴漏為80端口 [root@master ~]# kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP service/nginx-deploy exposed #查看服務 services 簡寫為svc [root@master ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 18h nginx ClusterIP 10.98.2.12 <none> 80/TCP 3s 35s此時在節點訪問svc的80端口來訪問pod,即使Pod被刪除后重建也可以訪問
#Pod在node02上,次數使用node01來訪問 [root@node01 ~]# curl -I 10.98.2.12 HTTP/1.1 200 OK Server: nginx/1.14.2 Date: Thu, 28 Mar 2019 02:48:13 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Fri, 08 Mar 2019 03:09:00 GMT Connection: keep-alive ETag: "5c81dccc-264" Accept-Ranges: bytes #刪除Pod后再次嘗試 [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deploy-84cbfc56b6-w66pw 1/1 Running 0 20m [root@master ~]# kubectl delete pods nginx-deploy-84cbfc56b6-w66pw pod "nginx-deploy-84cbfc56b6-w66pw" deleted [root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deploy-84cbfc56b6-tcssz 1/1 Running 0 6s 10.244.2.4 node02 <none> <none> [root@node01 ~]# curl -I 10.98.2.12 HTTP/1.1 200 OK Server: nginx/1.14.2 Date: Thu, 28 Mar 2019 02:49:35 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Fri, 08 Mar 2019 03:09:00 GMT Connection: keep-alive ETag: "5c81dccc-264" Accept-Ranges: bytes10.99.146.96這網段依然是集群內部的網段,只能被集群內部客戶端訪問,外部是無法通過service的ip進行訪問。那么針對pod的客戶端除了通過service ip訪問還可以通過service的名稱進行訪問,但是前提是需要對service的名稱能夠進行解析。而解析時是依賴coredns服務的,而我們本地的dns指向并非coredns,如下:
[root@node02 ~]# curl -I nginx curl: (6) Could not resolve host: nginx-deploy; 未知的錯誤 #查看節點的dns地址 [root@node02 ~]# cat /etc/resolv.conf # Generated by NetworkManager nameserver 114.114.114.114 nameserver 10.0.0.2查看coredns的IP地址
[root@master ~]# kubectl get pods -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES coredns-78d4cf999f-6cb69 1/1 Running 0 18h 10.244.1.2 node01 <none> <none> coredns-78d4cf999f-tflpn 1/1 Running 0 18h 10.244.1.3 node01 <none> <none> etcd-master 1/1 Running 0 18h 10.0.0.10 master <none> <none> kube-apiserver-master 1/1 Running 0 18h 10.0.0.10 master <none> <none> kube-controller-manager-master 1/1 Running 0 18h 10.0.0.10 master <none> <none> kube-flannel-ds-amd64-gtv85 1/1 Running 0 18h 10.0.0.10 master <none> <none> kube-flannel-ds-amd64-gwbql 1/1 Running 1 18h 10.0.0.12 node02 <none> <none> kube-flannel-ds-amd64-ml7nf 1/1 Running 0 18h 10.0.0.11 node01 <none> <none> kube-proxy-ch4vp 1/1 Running 0 18h 10.0.0.11 node01 <none> <none> kube-proxy-cz2rf 1/1 Running 1 18h 10.0.0.12 node02 <none> <none> kube-proxy-kdp7d 1/1 Running 0 18h 10.0.0.10 master <none> <none> kube-scheduler-master 1/1 Running 0 18h 10.0.0.10 master <none> <none> #-n指定名稱空間正常來說,也不會直接訪問coredns的Pod的IP來直接訪問,也是通過coredns的service進行訪問
[root@master ~]# kubectl get svc -n kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 18h可以通過這個service ip:10.96.0.10進行解析上面的nginx服務。
提前準備dig命令 yum install -y bind-utils,這里需要使用完整的服務名稱,否則可能由于dns搜索域問題導致失敗
嘗試通過集群內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 / # wget -O - -q http://nginx:80 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;} </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p><p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p> </body> </html>此時name為nginx的service就為name為nginx-deploy的deployment提供了固定訪問斷電,無論deployment內Pod的增加刪除,都不影響訪問,使用命令來查看services的詳細信息:
[root@master ~]# kubectl describe svc nginx Name: nginx Namespace: default Labels: run=nginx-deploy Annotations: <none> Selector: run=nginx-deploy Type: ClusterIP IP: 10.98.2.12 Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: 10.244.2.4:80 Session Affinity: None Events: <none>#Endpoints: Pod的IP地址無論Pod怎么增刪,只要標Labels存在run=nginx-deploy的 就會被svc鎖訪問。
[root@master ~]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS client 1/1 Running 0 28m run=client nginx-deploy-84cbfc56b6-tcssz 1/1 Running 0 51m pod-template-hash=84cbfc56b6,run=nginx-deployrun=nginx-deploy就是這個應用的標簽,所以當pod的改變,并不會影響service的訪問。
kubectl scale 動態伸縮應用副本
語法
Usage:kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME)舉例
#創建新的deployment [root@master ~]# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2 kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead. deployment.apps/myapp created [root@master ~]# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE myapp 2/2 2 2 48s nginx-deploy 1/1 1 1 3h58m #查看pod [root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES client 0/1 Completed 0 3h2m 10.244.2.5 node02 <none> <none> myapp-9b4987d5-98k45 1/1 Running 0 64s 10.244.1.4 node01 <none> <none> myapp-9b4987d5-ncpb7 1/1 Running 0 64s 10.244.2.6 node02 <none> <none> nginx-deploy-84cbfc56b6-tcssz 1/1 Running 0 3h26m 10.244.2.4 node02 <none> <none>此時使用客戶端訪問
/ # wget -O - -q 10.244.2.6/hostname.html myapp-9b4987d5-ncpb7 / # wget -O - -q 10.244.1.4/hostname.html myapp-9b4987d5-98k45為myapp創建service
[root@master ~]# kubectl expose deployment myapp --name=myapp --port=80 service/myapp exposed [root@master ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 22h myapp ClusterIP 10.104.138.182 <none> 80/TCP 3s nginx ClusterIP 10.98.2.12 <none> 80/TCP 3h21m所生成的myapp的地址為10.104.138.182,端口暴漏為80,協議默認為TCP
使用客戶端訪問myapp服務
擴展副本數量
[root@master ~]# kubectl scale --replicas=5 deployment myapp deployment.extensions/myapp scaled [root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES client-f5cdb799f-pklmc 1/1 Running 0 5m46s 10.244.2.7 node02 <none> <none> myapp-9b4987d5-98k45 1/1 Running 0 8m44s 10.244.1.4 node01 <none> <none> myapp-9b4987d5-ck9bt 1/1 Running 0 9s 10.244.2.8 node02 <none> <none> myapp-9b4987d5-gfqjp 1/1 Running 0 9s 10.244.2.9 node02 <none> <none> myapp-9b4987d5-ncpb7 1/1 Running 0 8m44s 10.244.2.6 node02 <none> <none> myapp-9b4987d5-wrp7r 1/1 Running 0 9s 10.244.1.5 node01 <none> <none> nginx-deploy-84cbfc56b6-tcssz 1/1 Running 0 3h33m 10.244.2.4 node02 <none> <none>此時使用客戶端訪問myapp服務
/ # for i in `seq 10000`;do wget -O - -q myapp/hostname.html;sleep 1;done myapp-9b4987d5-wrp7r myapp-9b4987d5-ncpb7 myapp-9b4987d5-wrp7r myapp-9b4987d5-98k45 myapp-9b4987d5-wrp7r myapp-9b4987d5-98k45 myapp-9b4987d5-gfqjp myapp-9b4987d5-wrp7r myapp-9b4987d5-gfqjp myapp-9b4987d5-gfqjp myapp-9b4987d5-ncpb7再次修改副本數量為3
[root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES client-f5cdb799f-pklmc 1/1 Running 0 8m32s 10.244.2.7 node02 <none> <none> myapp-9b4987d5-98k45 1/1 Running 0 11m 10.244.1.4 node01 <none> <none> myapp-9b4987d5-ck9bt 0/1 Terminating 0 2m55s 10.244.2.8 node02 <none> <none> myapp-9b4987d5-gfqjp 0/1 Terminating 0 2m55s 10.244.2.9 node02 <none> <none> myapp-9b4987d5-ncpb7 1/1 Running 0 11m 10.244.2.6 node02 <none> <none> myapp-9b4987d5-wrp7r 1/1 Running 0 2m55s 10.244.1.5 node01 <none> <none> nginx-deploy-84cbfc56b6-tcssz 1/1 Running 0 3h36m 10.244.2.4 node02 <none> <none>#客戶端查看 myapp-9b4987d5-98k45 myapp-9b4987d5-98k45 myapp-9b4987d5-wrp7r myapp-9b4987d5-wrp7r myapp-9b4987d5-wrp7r myapp-9b4987d5-wrp7r myapp-9b4987d5-ncpb7 myapp-9b4987d5-ncpb7 myapp-9b4987d5-98k45此時服務就只會訪問剩余的3個副本間
kubectl set image 應用版本升級
語法
Usage:
kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N
[options]
舉例
也可以使用kubectl describe 來查看Pod的詳細信息
[root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE client-f5cdb799f-pklmc 1/1 Running 0 21m myapp-65899575cd-q9wt9 1/1 Running 0 4m56s myapp-65899575cd-xhwmr 1/1 Running 0 4m58s myapp-65899575cd-xnqd4 1/1 Running 0 4m58s nginx-deploy-84cbfc56b6-tcssz 1/1 Running 0 3h49m [root@master ~]# kubectl describe pods myapp-65899575cd-xhwmr Name: myapp-65899575cd-xhwmr Namespace: default Priority: 0 PriorityClassName: <none> Node: node01/10.0.0.11 Start Time: Thu, 28 Mar 2019 14:33:50 +0800 Labels: pod-template-hash=65899575cdrun=myapp Annotations: <none> Status: Running IP: 10.244.1.10 Controlled By: ReplicaSet/myapp-65899575cd Containers:myapp:Container ID: docker://5f9c63ce9f84fb6f863b44dd2eb9626f3eff2a599b48eb7000c84f5b70f6d2c9Image: ikubernetes/myapp:v2 ... ...kubectl rollout 回滾
一種方法是直接修改image版本,另外一種是使用kubectl rollout
[root@master ~]# kubectl rollout -h Manage the rollout of a resource.Valid resource types include: * deployments * daemonsets * statefulsetsExamples:# Rollback to the previous deploymentkubectl rollout undo deployment/abc# Check the rollout status of a daemonsetkubectl rollout status daemonset/fooAvailable Commands:history 顯示 rollout 歷史pause 標記提供的 resource 為中止狀態resume 繼續一個停止的 resourcestatus 顯示 rollout 的狀態undo 撤銷上一次的 rolloutUsage:kubectl rollout SUBCOMMAND [options]舉例
[root@master ~]# kubectl rollout undo deployment myapp deployment.extensions/myapp rolled back [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE client-f5cdb799f-pklmc 1/1 Running 0 24m myapp-65899575cd-q9wt9 0/1 Terminating 0 8m15s myapp-65899575cd-xhwmr 1/1 Terminating 0 8m17s myapp-65899575cd-xnqd4 1/1 Running 0 8m17s myapp-9b4987d5-47sjj 0/1 ContainerCreating 0 0s myapp-9b4987d5-684q9 1/1 Running 0 2s myapp-9b4987d5-djdr9 1/1 Running 0 3s nginx-deploy-84cbfc56b6-tcssz 1/1 Running 0 3h52m#客戶端查看 / # for i in `seq 10000`;do wget -O - -q myapp;sleep 1;done 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> 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: 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> #已經全部回退到上個版本集群外部訪問Service
[root@master ~]# kubectl edit svc myapp # Please edit the object below. Lines beginning with a '#' will be ignored, # and an empty file will abort the edit. If an error occurs while saving this file will be # reopened with the relevant failures. # apiVersion: v1 kind: Service metadata:creationTimestamp: "2019-03-28T06:20:00Z"labels:run: myappname: myappnamespace: defaultresourceVersion: "36470"selfLink: /api/v1/namespaces/default/services/myappuid: 8425bae4-5121-11e9-80a7-000c295ec349 spec:clusterIP: 10.104.138.182ports:- port: 80protocol: TCPtargetPort: 80selector:run: myappsessionAffinity: Nonetype: NodePort status:loadBalancer: {}查看服務
[root@master ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 22h myapp NodePort 10.104.138.182 <none> 80:30298/TCP 38m nginx ClusterIP 10.98.2.12 <none> 80/TCP 4hmyapp服務80端口映射到節點的30298,且整個集群的30298節點都可以訪問
另一節點訪問
參考資料
https://www.cnblogs.com/linuxk
馬永亮. Kubernetes進階實戰 (云計算與虛擬化技術叢書)
轉載于:https://www.cnblogs.com/wlbl/p/10694277.html
總結
以上是生活随笔為你收集整理的Kubernetes之(五)快速部署应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 仙人掌找环板子
- 下一篇: 06Struts2国际化实现