溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

docker中k8s怎么用

發(fā)布時(shí)間:2021-11-19 11:30:08 來源:億速云 閱讀:174 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下docker中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的客戶端工具,可以實(shí)現(xiàn)對nodes資源的增刪改查。

 kubectl describe

功能:描述一個節(jié)點(diǎn)的信息

[root@k8s-master chenzx]# kubectl describe node k8s-node1
Name:               k8s-node1
Taints:             <none>  ##Taints表示是否有污點(diǎn)
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 https://172.16.1.100:6443
KubeDNS is running at https://172.16.1.100:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

創(chuàng)建并運(yùn)行鏡像

舉例:創(chuàng)建一個nginx鏡像

[root@k8s-master chenzx]# kubectl run nginx-deploy  --image=nginx:1.14-alpine --port=80 --replicas=1 --dry-run=true

說明:

        --image:表示docker官網(wǎng)的鏡像名字

        --replicas:表示創(chuàng)建并啟動幾個Pod,不寫默認(rèn)就是1個

        --dry-run:表示并不真正執(zhí)行,去掉這個選擇就真正執(zhí)行了

[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項(xiàng)要保證為1,表示為可用狀態(tài)。一開始運(yùn)行kubectl get deployment時(shí)AVAILABLE可能為0,這時(shí)在做就緒行探測,過一會就會變?yōu)?;Desired表示期望幾個副本,current表示實(shí)際上有幾個副本。

[root@master ~]# kubectl get pod
NAME                          READY     STATUS    RESTARTS   AGE
nginx-deploy-5b595999-65rff   1/1       Running   0          1m

說明:1/1表示這個pod里面有一個容器,并且都準(zhǔn)備好了。

        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節(jié)點(diǎn)上運(yùn)行著,這個pod的ip地址是10.244.2.2。這個pod使用的是node2節(jié)點(diǎn)上的cni0的地址(在node2上用ifconfig查看)。

訪問一下nginx頁面:

[root@node2 ~]# curl  10.244.2.2 
Welcome to nginx!

可以看到welcom to nginx的字樣。

pod的地址10.244.2.2只能在k8s內(nèi)部使用,跳過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是控制器來管理的,如果我們刪除正在運(yùn)行的pod后,控制器會馬上再創(chuàng)建一個新的pod,這個新的pod和原來的一樣,并換個node節(jié)點(diǎn),如上從node2到node1上,并且ip地址也變了。這是因?yàn)楸仨毐3忠欢〝?shù)量的pod副本在線。

發(fā)布端口

[root@master ~]# kubectl  expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP

--name:名字隨便起,是我們要創(chuàng)建的service名字。

上面命令的含義是給deployment控制器下的nginx -deploy pod創(chuàng)建一個serivice,而service名字叫nginx,service的端口(--port)是80,映射到nginx-deploy pod的端口(--target-port)端口是80.

查看service的詳細(xì)信息:

[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

查看標(biāo)簽

上面clusterip就是service ip,但是這個ip只能集群內(nèi)部訪問,集群外部是訪問不了的。nginx(service name)會生成iptables訪問規(guī)則, 把cluster ip對應(yīng)的地址和port都調(diào)度至標(biāo)簽選擇器關(guān)聯(lián)到的各pod端,可以通過kubectl describe svc nginx來看nginx這個服務(wù)資源的詳細(xì)信息:

[root@master ~]# kubectl describe svc nginx
Name:              nginx
Namespace:         default
Labels:            run=nginx-deploy  ##這就是標(biāo)簽選擇器,這個標(biāo)簽對應(yīng)的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關(guān)聯(lián)的是10.244.1.3:80這個pod
Session Affinity:  None
Events:            <none>

通過如下命令可以看到各pod的標(biāo)簽:

[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進(jìn)行解析的。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命令,發(fā)現(xiàn)沒有解析出來nginx域名對應(yīng)的ip地址,這是因?yàn)閚ginx域名沒寫完整,下面我們就要看看k8s集群內(nèi)部配置的域名后綴是什么。

下面我們再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中對應(yīng)的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這個域名對應(yīng)的ip是10.100.47.128。注意nginx是service的名字(通過 kubectl get service可以看到)。

下面我們把nginx pod刪除,可以看到k8s很快自動的啟動一個新的nginx pod,并且nginx pod地址發(fā)生了改變,再通過nginx域名(service name)訪問,還能看到nginx的頁面,這就是因?yàn)閟ervice根據(jù)標(biāo)簽和標(biāo)簽選擇器來關(guān)聯(lián)pod資源,而不是根據(jù)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,這里面的變化會立刻反應(yīng)到coredns解析記錄中去。

查看控制器(deployment)的詳細(xì)信息

控制器deployment也是通過標(biāo)簽選擇器來管理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>

動態(tài)修改replicas副本的數(shù)量

先新建一個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監(jiān)控的意思,就不會退出了
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

下面開始動態(tài)擴(kuò)展副本數(shù)量為5:

[root@master ~]# kubectl scale --replicas=5 deployment mytomcat
deployment.extensions/mytomcat scaled

看到擴(kuò)展成功:

[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

能擴(kuò)展,也能縮減,下面縮減為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

創(chuàng)建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

然后客戶端通過訪問 http://mytomcat會看到負(fù)載均衡現(xiàn)象,即一會訪問node1上的tomcat,一會訪問node2上的tomcat。

動態(tài)升級pod版本

[root@master ~]# kubectl set image deployment mytomcat mytomcat=ikubernetes/mytomcat:v2
deployment.extensions/mytomcat image updated

說明:mytomcat=ikubernetes/mytomcat:v2是容器1版本=容器2版本

通過下面的命令可以動態(tài)查看更新狀態(tài):

[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端口訪問內(nèi)部資源了

以上是“docker中k8s怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI