docker中k8s怎么用
小编给大家分享一下docker中k8s怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
之前安装了一个master和两个nodes的k8s集群:
[root@k8s-master chenzx]# kubectl get nodesNAME STATUS ROLES AGE VERSIONk8s-master Ready master 17h v1.11.2k8s-node1 Ready <none> 14h v1.11.2k8s-node2 Ready <none> 13h v1.11.2
kubectl命令就是apiserver的客户端工具,可以实现对nodes资源的增删改查。
kubectl describe
功能:描述一个节点的信息
[root@k8s-master chenzx]# kubectl describe node k8s-node1Name: k8s-node1Taints: <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-infoKubernetes master is running at https://172.16.1.100:6443KubeDNS is running at https://172.16.1.100:6443/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 AGEnginx-deploy 1 1 1 1 12s
说明:AVAILABLE项要保证为1,表示为可用状态。一开始运行kubectl get deployment时AVAILABLE可能为0,这时在做就绪行探测,过一会就会变为1;Desired表示期望几个副本,current表示实际上有几个副本。
[root@master ~]# kubectl get podNAME READY STATUS RESTARTS AGEnginx-deploy-5b595999-65rff 1/1 Running 0 1m
说明:1/1表示这个pod里面有一个容器,并且都准备好了。
RESTARTs=0表示没有被重启过
[root@master ~]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODEnginx-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 podNAME READY STATUS RESTARTS AGEnginx-deploy-5b595999-65rff 1/1 Running 0 40m[root@master ~]# kubectl delete pods nginx-deploy-5b595999-65rffpod "nginx-deploy-5b595999-65rff" deleted[root@master ~]# kubectl get podNAME READY STATUS RESTARTS AGEnginx-deploy-5b595999-fzwvq 1/1 Running 0 21s[root@master ~]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODEnginx-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 #全称是serviceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2dnginx ClusterIP 10.100.47.128 <none> 80/TCP 2d[root@master ~]# kubectl get serviceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2dnginx 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 nginxName: nginxNamespace: defaultLabels: run=nginx-deploy ##这就是标签选择器,这个标签对应的pod可以通过下面的Endpoints看出。Annotations: <none>Selector: run=nginx-deployType: ClusterIPIP: 10.100.47.128Port: <unset> 80/TCPTargetPort: 80/TCPEndpoints: 10.244.1.3:80 #通过这个可以看到nginx service关联的是10.244.1.3:80这个podSession Affinity: NoneEvents: <none>
通过如下命令可以看到各pod的标签:
[root@master ~]# kubectl get pods --show-labelsNAME READY STATUS RESTARTS AGE LABELSclient 1/1 Running 0 42m run=clientnginx-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 wideNAME READY STATUS RESTARTS AGE IP NODEcoredns-78fcdf6894-2l2cf 1/1 Running 0 2d 10.244.0.2 mastercoredns-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-systemNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkube-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=NeverIf you don't see a command prompt, try pressing enter./ # cat /etc/resolv.conf nameserver 10.96.0.10search default.svc.cluster.local svc.cluster.local cluster.localoptions 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 podsNAME READY STATUS RESTARTS AGEclient 1/1 Running 0 59mnginx-deploy-5b595999-fzwvq 1/1 Running 0 2d[root@master ~]# kubectl delete pods nginx-deploy-5b595999-fzwvqpod "nginx-deploy-5b595999-fzwvq" deleted[root@master ~]# kubectl get podsNAME READY STATUS RESTARTS AGEclient 1/1 Running 0 59mnginx-deploy-5b595999-2hbgh 1/1 Running 0 11s[root@master ~]# kubectl run client --image=busybox --replicas=1 -it --restart=NeverIf 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 svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3dnginx ClusterIP 10.100.47.128 <none> 80/TCP 2d[root@master ~]# [root@master ~]# kubectl describe svc nginxName: nginxNamespace: defaultLabels: run=nginx-deployAnnotations: <none>Selector: run=nginx-deployType: ClusterIPIP: 10.100.47.128Port: <unset> 80/TCPTargetPort: 80/TCPEndpoints: 10.244.1.3:80Session Affinity: NoneEvents: <none>
[root@master ~]# kubectl edit svc nginx
打开后改变cluster ip的地址,比如改成10.100.47.88,这里面的变化会立刻反应到coredns解析记录中去。
查看控制器(deployment)的详细信息
控制器deployment也是通过标签选择器来管理Pod的。
[root@master ~]# kubectl describe deployment nginx-deployName: nginx-deployNamespace: defaultCreationTimestamp: Fri, 07 Sep 2018 09:03:36 -0400Labels: run=nginx-deployAnnotations: deployment.kubernetes.io/revision=1Selector: run=nginx-deployReplicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailableStrategyType: RollingUpdateMinReadySeconds: 0RollingUpdateStrategy: 25% max unavailable, 25% max surgePod 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 MinimumReplicasAvailableOldReplicaSets: <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 deploymentNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEmyapp 2 2 2 0 3hmytomcat 2 2 2 2 10m
[root@master ~]# kubectl get deployment -w #-w是watch监控的意思,就不会退出了NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEmyapp 2 2 2 0 3hmytomcat 2 2 2 2 10m
[root@master ~]# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODEclient 1/1 Running 0 4h 10.244.2.4 node2mytomcat-5f8c6fdcb-lhcsc 1/1 Running 0 11m 10.244.2.7 node2mytomcat-5f8c6fdcb-rntrg 1/1 Running 0 3m 10.244.1.10 node1
下面开始动态扩展副本数量为5:
[root@master ~]# kubectl scale --replicas=5 deployment mytomcatdeployment.extensions/mytomcat scaled
看到扩展成功:
[root@master ~]# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODEclient 1/1 Running 0 5h 10.244.2.4 node2mytomcat-5f8c6fdcb-7t5s2 1/1 Running 0 1m 10.244.2.8 node2mytomcat-5f8c6fdcb-l2cdn 1/1 Running 0 1m 10.244.1.11 node1mytomcat-5f8c6fdcb-lhcsc 1/1 Running 0 32m 10.244.2.7 node2mytomcat-5f8c6fdcb-rntrg 1/1 Running 0 24m 10.244.1.10 node1mytomcat-5f8c6fdcb-thzjf 1/1 Running 0 1m 10.244.2.9 node2nginx-deploy-5b595999-fpm8x 1/1 Running 0 33m 10.244.1.7 node1
能扩展,也能缩减,下面缩减为3个副本:
[root@master ~]# kubectl scale --replicas=3 deployment mytomcatdeployment.extensions/mytomcat scaled
[root@master ~]# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODEmytomcat-5f8c6fdcb-7t5s2 1/1 Running 0 3m 10.244.2.8 node2mytomcat-5f8c6fdcb-lhcsc 1/1 Running 0 34m 10.244.2.7 node2mytomcat-5f8c6fdcb-rntrg 1/1 Running 0 26m 10.244.1.10 node1mytomcat-5f8c6fdcb-thzjf 0/1 Terminating 0 3m 10.244.2.9 node2
创建service
[root@master ~]# kubectl get deploymentNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEmyapp 2 2 2 0 4hmytomcat 2 2 2 2 22m
[root@master ~]# kubectl expose deployment mytomcat --name=mytomcat --port 80service/mytomcat exposed
[root@master ~]# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODEmytomcat-5f8c6fdcb-lhcsc 1/1 Running 0 25m 10.244.2.7 node2mytomcat-5f8c6fdcb-rntrg 1/1 Running 0 17m 10.244.1.10 node1
[root@master ~]# kubectl get svcmytomcat ClusterIP 10.98.25.122 <none> 80/TCP 1m
然后客户端通过访问http://mytomcat会看到负载均衡现象,即一会访问node1上的tomcat,一会访问node2上的tomcat。
动态升级pod版本
[root@master ~]# kubectl set image deployment mytomcat mytomcat=ikubernetes/mytomcat:v2deployment.extensions/mytomcat image updated
说明:mytomcat=ikubernetes/mytomcat:v2是容器1版本=容器2版本
通过下面的命令可以动态查看更新状态:
[root@master ~]# kubectl rollout status deployment mytomcatWaiting 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:v1deployment.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 svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEmytomcat NodePort 10.98.25.122 <none> 80:31388/TCP 1h
这样在外部就可以通过31338端口访问内部资源了
以上是“docker中k8s怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341