基本命令使用
1、kubectl describe
描述某个节点的
[root@master ~]# kubectl describe node master
2、kubectl cluster-info
获取集群的信息
[root@master ~]# kubectl cluster-info
Kubernetes master is running at https://10.10.20.207:6443
KubeDNS is running at https://10.10.20.207:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
3、kubectl run
在pod中创建并运行特定的镜像。
[root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 --dry-run=true
Flag --replicas has been deprecated, has no effect and will be removed in the future.
W0525 12:32:18.194302 100893 helpers.go:549] --dry-run=true is deprecated (boolean value) and can be replaced with --dry-run=client.
pod/nginx-deploy created (dry run)
[root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1
Flag --replicas has been deprecated, has no effect and will be removed in the future.
pod/nginx-deploy created
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy 1/1 Running 0 36m 10.244.2.2 node2 <none> <none>
pod使用的网络接口名是cni0,在部署kubernetes指定的。通过上面的信息可以看出新创建的pod运行在node2节点上,查看node2的网络信息,其网段为10.244.2.0/24
[root@node2 ~]# ifconfig
cni0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 10.244.2.1 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::9027:86ff:fe56:5df5 prefixlen 64 scopeid 0x20<link>
ether 92:27:86:56:5d:f5 txqueuelen 1000 (Ethernet)
RX packets 7 bytes 1174 (1.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 35 bytes 4542 (4.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
在节点一上访问
[root@node1 ~]# curl 10.244.2.2
<!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>
删除pod资源
[root@master ~]# kubectl delete pods nginx-deploy
pod "nginx-deploy" deleted
当我们删除这个pod后,Deployment会重新创建一个pod,该pod的ip就会变化。所以,我们使用pod ip或pod hostname访问是不合适的,我们需要提供一个固定ip及端口。service可以满足要求。
创建一个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,默认是 CLUSTER-IP类型
[root@master ~]# kubectl expose pod nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP
service/nginx exposed
查看service信息,IP地址是10.107.39.26,是动态生成的,属于10.96.0.0/12网段。
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d23h
nginx ClusterIP 10.107.39.26 <none> 80/TCP 68s
现在,我们就可以在节点上通过ip 10.107.39.26 访问,但是在集群外部无法访问。
[root@node1 ~]# curl 10.107.39.26
<!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>
这类地址,更多时候是被pod客户端访问的。
因此我们创建一个pod客户端,来测试:
[root@master ~]# kubectl run client --image=busybox -it
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
在集群中,使用dig命令解析nginx这个service的IP地址。
注意,此处要加上default.svc.cluster.local这个域后缀,否则,它默认会搜索本机的搜素域,会导致无法解析。
[root@master ~]# dig -t A nginx.default.svc.cluster.local @10.96.0.10
; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7 <<>> -t A nginx.default.svc.cluster.local @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26811
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;nginx.default.svc.cluster.local. IN A
;; ANSWER SECTION:
nginx.default.svc.cluster.local. 30 IN A 10.107.39.26
;; Query time: 0 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: 一 5月 25 15:32:21 CST 2020
;; MSG SIZE rcvd: 107
此时,在busybox这个pod里,我们可以直接通过service的名称nginx 访问,而不是service的ip:port。
# busybox里
/ # wget nginx
Connecting to nginx (10.107.39.26:80)
saving to 'index.html'
index.html 100% |*****************************************************************************************************| 612 0:00:00 ETA
'index.html' saved
/ # 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>
注意:10.107.39.26是nginx的service的ip。
注意:coredns 也是以pod的形式运行的,因为pod再重新创建时IP地址不固定,所以coredns也需要创建一个service服务,即kube-dns地址为10.96.0.10
[root@master ~]# kubectl get pod -n kube-system -o wide | grep coredns
coredns-7ff77c879f-5nrtt 1/1 Running 1 3d23h 10.244.0.5 master <none> <none>
coredns-7ff77c879f-wltqv 1/1 Running 1 3d23h 10.244.0.4 master <none> <none>
此时,我们人为将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.107.39.26
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.3: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版本。
回滚
可以直接修改image
也可以使用undo
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 7d21h
myapp-svc NodePort 10.110.73.139 <none> 80:30119/TCP 79m
nginx ClusterIP 10.107.39.26 <none> 80/TCP 3d21h
发现myapp-svc绑定了30119端口。
在集群外部使用浏览器访问nodeIP:30724 就可以实现访问了(使用任意一个节点IP都可以)
命令行访问
[root@master ~]# curl http://192.168.147.133:30119
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@master ~]# while true; do curl http://192.168.147.133:30119; sleep 2;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>
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 curl http://192.168.147.134:30119; sleep 1;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>
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@node1 network-scripts]# while true; do curl http://192.168.147.132:30119; sleep 1;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>
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>