docker筆記21-k8s的使用入門
我們透過上一篇文件,安裝了一個master和兩個nodes的k8s叢集:
[root@k8s-master chenzx]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready master 17h v1.11.2 k8s-node1 Ready <none> 14h v1.11.2 k8s-node2 Ready <none> 13h v1.11.2
kubectl命令就是apiserver的客戶端工具,可以實現對nodes資源的增刪改查。
kubectl describe
功能:描述一個節點的資訊
[root@k8s-master chenzx]# kubectl describe node k8s-node1 Name: k8s-node1 Taints: <none> ##Taints表示是否有汙點 Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted.) Resource Requests Limits -------- -------- ------ cpu 100m (10%) 100m (10%) memory 50Mi (2%) 50Mi (2%) Events: <none>
kubectl cluster-info
功能:看k8s叢集資訊
[root@k8s-master chenzx]# kubectl cluster-info Kubernetes master is running at KubeDNS is running at /api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
建立並執行映象
舉例:建立一個nginx映象
[root@k8s-master chenzx]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 --dry-run=true
說明:
--image:表示docker官網的映象名字
--replicas:表示建立並啟動幾個Pod,不寫預設就是1個
--dry-run:表示並不真正執行,去掉這個選擇就真正執行了
[root@k8s-master chenzx]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 deployment.apps/nginx-deploy created
[root@k8s-master chenzx]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deploy 1 1 1 1 12s
說明:AVAILABLE項要保證為1,表示為可用狀態。一開始執行kubectl get deployment時AVAILABLE可能為0,這時在做就緒行探測,過一會就會變為1;Desired表示期望幾個副本,current表示實際上有幾個副本。
[root@master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deploy-5b595999-65rff 1/1 Running 0 1m
說明:1/1表示這個pod裡面有一個容器,並且都準備好了。
RESTARTs=0表示沒有被重啟過
[root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-deploy-5b595999-65rff 1/1 Running 0 23m 10.244.2.2 node2
透過-o wide可以顯示更多資訊,比如可以看到nginx這個容器在node2節點上執行著,這個pod的ip地址是10.244.2.2。這個pod使用的是node2節點上的cni0的地址(在node2上用ifconfig檢視)。
訪問一下nginx頁面:
[root@node2 ~]# curl 10.244.2.2 Welcome to nginx!
可以看到welcom to nginx的字樣。
pod的地址10.244.2.2只能在k8s內部使用,跳過k8s之外是無法使用的。
我們知道pod的客戶端有兩類;
第一類:其他pod;
第二類:叢集外部客戶端。
刪除pod
[root@master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deploy-5b595999-65rff 1/1 Running 0 40m [root@master ~]# kubectl delete pods nginx-deploy-5b595999-65rff pod "nginx-deploy-5b595999-65rff" deleted [root@master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deploy-5b595999-fzwvq 1/1 Running 0 21s [root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-deploy-5b595999-fzwvq 1/1 Running 0 3m 10.244.1.2 node1
pod是控制器來管理的,如果我們刪除正在執行的pod後,控制器會馬上再建立一個新的pod,這個新的pod和原來的一樣,並換個node節點,如上從node2到node1上,並且ip地址也變了。這是因為必須保持一定數量的pod副本線上。
釋出埠
[root@master ~]# kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP
--name:名字隨便起,是我們要建立的service名字。
上面命令的含義是給deployment控制器下的nginx -deploy pod建立一個serivice,而service名字叫nginx,service的埠(--port)是80,對映到nginx-deploy pod的埠(--target-port)埠是80.
檢視service的詳細資訊:
[root@master ~]# kubectl get svc #全稱是service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d nginx ClusterIP 10.100.47.128 <none> 80/TCP 2d [root@master ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d nginx ClusterIP 10.100.47.128 <none> 80/TCP 2d
檢視標籤
上面clusterip就是service ip,但是這個ip只能叢集內部訪問,叢集外部是訪問不了的。nginx(service name)會生成iptables訪問規則, 把cluster ip對應的地址和port都排程至標籤選擇器關聯到的各pod端,可以透過kubectl describe svc nginx來看nginx這個服務資源的詳細資訊:
[root@master ~]# kubectl describe svc nginx Name: nginx Namespace: default Labels: run=nginx-deploy ##這就是標籤選擇器,這個標籤對應的pod可以透過下面的Endpoints看出。 Annotations: <none> Selector: run=nginx-deploy Type: ClusterIP IP: 10.100.47.128 Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: 10.244.1.3:80 #透過這個可以看到nginx service關聯的是10.244.1.3:80這個pod Session Affinity: None Events: <none>
透過如下命令可以看到各pod的標籤:
[root@master ~]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS client 1/1 Running 0 42m run=client nginx-deploy-5b595999-2hbgh 1/1 Running 0 1h pod-template-hash=16151555,run=nginx-deploy
檢視coredns
另外,我們可以透過service ip訪問,也可以透過serivce name訪問,但是這個service name是透過k8s的coredns進行解析的。cordns地址的檢視方法如下:
[root@master ~]# kubectl get pods -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP NODE coredns-78fcdf6894-2l2cf 1/1 Running 0 2d 10.244.0.2 master coredns-78fcdf6894-dkkfq 1/1 Running 0 2d 10.244.0.3 master
上面我們看到coredns的pod地址分別是10.244.0.2和10.244.0.3。但是我們一般也不直接使用pod的地址,而是使用service ip來訪問coredns pod:
[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 2d
[root@master ~]# yum -y install bind-utils
[root@master ~]# dig -t A nginx @10.96.0.10 #表示用dns10.96.0.10解析域名nginx地址,A表示A記錄 ; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> -t A nginx @10.96.0.10 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 3924 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4000 ;; QUESTION SECTION: ;nginx.INA ;; Query time: 1 msec ;; SERVER: 10.96.0.10#53(10.96.0.10) ;; WHEN: Mon Sep 10 02:53:19 EDT 2018 ;; MSG SIZE rcvd: 34
上面我們用dig命令,發現沒有解析出來nginx域名對應的ip地址,這是因為nginx域名沒寫完整,下面我們就要看看k8s叢集內部配置的域名字尾是什麼。
下面我們再run一個busybox pod,作為其他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 / #
上面我們看到cordns搜尋的域是default.svc.cluster.local svc.cluster.local cluster.local。
那麼我們再來測試一下nginx域名,在coredns中對應的ip地址:
[root@master ~]# dig -t A nginx.default.svc.cluster.local @10.96.0.10 ;; ANSWER SECTION: nginx.default.svc.cluster.local. 5 INA10.100.47.128
上面可以清楚的看到nginx.default.svc.cluster.local這個域名對應的ip是10.100.47.128。注意nginx是service的名字(透過 kubectl get service可以看到)。
下面我們把nginx pod刪除,可以看到k8s很快自動的啟動一個新的nginx pod,並且nginx pod地址發生了改變,再透過nginx域名(service name)訪問,還能看到nginx的頁面,這就是因為service根據標籤和標籤選擇器來關聯pod資源,而不是根據ip地址來選擇pod。這樣nginx pod地址無論怎麼變化,都能透過service name來訪問到pod資源。
[root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE client 1/1 Running 0 59m nginx-deploy-5b595999-fzwvq 1/1 Running 0 2d [root@master ~]# kubectl delete pods nginx-deploy-5b595999-fzwvq pod "nginx-deploy-5b595999-fzwvq" deleted [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE client 1/1 Running 0 59m nginx-deploy-5b595999-2hbgh 1/1 Running 0 11s [root@master ~]# kubectl run client --image=busybox --replicas=1 -it --restart=Never If you don't see a command prompt, try pressing enter. / # wget -O - -q <title>Welcome to nginx!</title> #nginx pod ip地址變了,但是還能透過nginx域名訪問到nginx頁面
改變service ip地址
[root@master ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d nginx ClusterIP 10.100.47.128 <none> 80/TCP 2d [root@master ~]# [root@master ~]# kubectl describe svc nginx Name: nginx Namespace: default Labels: run=nginx-deploy Annotations: <none> Selector: run=nginx-deploy Type: ClusterIP IP: 10.100.47.128 Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: 10.244.1.3:80 Session Affinity: None Events: <none>
[root@master ~]# kubectl edit svc nginx
開啟後改變cluster ip的地址,比如改成10.100.47.88,這裡面的變化會立刻反應到coredns解析記錄中去。
檢視控制器(deployment)的詳細資訊
控制器deployment也是透過標籤選擇器來管理Pod的。
[root@master ~]# kubectl describe deployment nginx-deploy Name: nginx-deploy Namespace: default CreationTimestamp: Fri, 07 Sep 2018 09:03:36 -0400 Labels: run=nginx-deploy Annotations: deployment.kubernetes.io/revision=1 Selector: run=nginx-deploy Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: run=nginx-deploy Containers: nginx-deploy: Image: nginx:1.14-alpine Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Progressing True NewReplicaSetAvailable Available True MinimumReplicasAvailable OldReplicaSets: <none> NewReplicaSet: nginx-deploy-5b595999 (1/1 replicas created) Events: <none>
動態修改replicas副本的數量
先新建一個pod:
[root@master ~]# kubectl run mytomcat --image=tomcat --replicas=2
[root@master ~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE myapp 2 2 2 0 3h mytomcat 2 2 2 2 10m
[root@master ~]# kubectl get deployment -w #-w是watch監控的意思,就不會退出了 NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE myapp 2 2 2 0 3h mytomcat 2 2 2 2 10m
[root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE client 1/1 Running 0 4h 10.244.2.4 node2 mytomcat-5f8c6fdcb-lhcsc 1/1 Running 0 11m 10.244.2.7 node2 mytomcat-5f8c6fdcb-rntrg 1/1 Running 0 3m 10.244.1.10 node1
下面開始動態擴充套件副本數量為5:
[root@master ~]# kubectl scale --replicas=5 deployment mytomcat deployment.extensions/mytomcat scaled
看到擴充套件成功:
[root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE client 1/1 Running 0 5h 10.244.2.4 node2 mytomcat-5f8c6fdcb-7t5s2 1/1 Running 0 1m 10.244.2.8 node2 mytomcat-5f8c6fdcb-l2cdn 1/1 Running 0 1m 10.244.1.11 node1 mytomcat-5f8c6fdcb-lhcsc 1/1 Running 0 32m 10.244.2.7 node2 mytomcat-5f8c6fdcb-rntrg 1/1 Running 0 24m 10.244.1.10 node1 mytomcat-5f8c6fdcb-thzjf 1/1 Running 0 1m 10.244.2.9 node2 nginx-deploy-5b595999-fpm8x 1/1 Running 0 33m 10.244.1.7 node1
能擴充套件,也能縮減,下面縮減為3個副本:
[root@master ~]# kubectl scale --replicas=3 deployment mytomcat deployment.extensions/mytomcat scaled
[root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE mytomcat-5f8c6fdcb-7t5s2 1/1 Running 0 3m 10.244.2.8 node2 mytomcat-5f8c6fdcb-lhcsc 1/1 Running 0 34m 10.244.2.7 node2 mytomcat-5f8c6fdcb-rntrg 1/1 Running 0 26m 10.244.1.10 node1 mytomcat-5f8c6fdcb-thzjf 0/1 Terminating 0 3m 10.244.2.9 node2
建立service
[root@master ~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE myapp 2 2 2 0 4h mytomcat 2 2 2 2 22m
[root@master ~]# kubectl expose deployment mytomcat --name=mytomcat --port 80 service/mytomcat exposed
[root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE mytomcat-5f8c6fdcb-lhcsc 1/1 Running 0 25m 10.244.2.7 node2 mytomcat-5f8c6fdcb-rntrg 1/1 Running 0 17m 10.244.1.10 node1
[root@master ~]# kubectl get svc mytomcat ClusterIP 10.98.25.122 <none> 80/TCP 1m
然後客戶端透過訪問
動態升級pod版本
[root@master ~]# kubectl set image deployment mytomcat mytomcat=ikubernetes/mytomcat:v2 deployment.extensions/mytomcat image updated
說明:mytomcat=ikubernetes/mytomcat:v2是容器1版本=容器2版本
透過下面的命令可以動態檢視更新狀態:
[root@master ~]# kubectl rollout status deployment mytomcat Waiting for deployment "mytomcat" rollout to finish: 1 out of 3 new replicas have been updated..
可以透過kubectl describe pods看容器的版本:
[root@master ~]# kubectl describe pods mytomcat-5f8c6fdcb-7t5s2 Image: tomcat
回滾pod至指定版本
如果版本升級失敗,可以回滾到指定版本:
[root@master ~]# kubectl rollout undo deployment mytomcat:v1 deployment.extensions/mytomcat
不指定版本表示回滾到上一個版本。
檢視service
[root@master ~]# iptables -vnL
root@master ~]# iptables -vnL -t nat
在叢集外部訪問pod
[root@master ~]# kubectl edit svc mytomcat
把type: ClusterIP改成NodePort。
[root@master ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mytomcat NodePort 10.98.25.122 <none> 80:31388/TCP 1h
這樣在外部就可以透過31338埠訪問內部資源了
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28916011/viewspace-2213635/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Docker 入門筆記Docker筆記
- Docker筆記1——入門(初識+搭建+使用)Docker筆記
- 【docker】Docker入門到實踐 筆記Docker筆記
- Docker入門學習筆記Docker筆記
- Docker技術筆記:Docker入門淺嘗Docker筆記
- docker筆記36-helm入門Docker筆記
- Docker快速入門總結筆記Docker筆記
- Docker 入門學習筆記一:Ubuntu安裝 DockerDocker筆記Ubuntu
- Docker的使用筆記Docker筆記
- XStream入門使用筆記筆記
- Docker使用入門Docker
- docker使用筆記Docker筆記
- MySQL學習筆記---入門使用MySql筆記
- docker入門1:使用docker映象Docker
- 深度學習入門筆記——Transform的使用深度學習筆記ORM
- Docker 入門學習筆記二:常用命令Docker筆記
- 深度學習入門筆記——DataLoader的使用深度學習筆記
- Docker for windows 入門二(Kitematic的使用)DockerWindows
- ClickHouse入門筆記筆記
- vue入門筆記Vue筆記
- spark入門筆記Spark筆記
- Redis入門筆記Redis筆記
- NPM入門筆記NPM筆記
- NSIS入門筆記筆記
- Go入門筆記Go筆記
- Mysql學習筆記2--使用入門MySql筆記
- 小洋的Python入門筆記😀Python筆記
- linux入門筆記Linux筆記
- Python入門筆記Python筆記
- Python 入門筆記Python筆記
- selenium 入門筆記筆記
- ByteBuddy入門筆記筆記
- Haskell 入門筆記(四)Haskell筆記
- Swift快速入門筆記Swift筆記
- JavaScript入門筆記(2)JavaScript筆記
- 【安卓筆記】ormlite入門安卓筆記ORM
- MySQL入門筆記2MySql筆記
- 筆記:第二節快速入門 流程圖的使用(下)筆記流程圖