一、认识pod
二、pod管理
- kubectl命令
网址:
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
- 运行服务
[kubeadm@server2 ~]$ kubectl run nginx --image=nginx
pod/nginx created
[kubeadm@server2 ~]$ kubectl get pod -n default
NAME READY STATUS RESTARTS AGE
nginx 0/1 ContainerCreating 0 20s
[kubeadm@server2 ~]$ kubectl get all -n default
NAME READY STATUS RESTARTS AGE
pod/nginx 1/1 Running 0 83s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h11m
查看服务信息(服务分配到了server4上)
[kubeadm@server2 ~]$ kubectl describe pod nginx
Name: nginx
Namespace: default
Priority: 0
Node: server4/172.25.60.4
IP: 10.244.2.2
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled <unknown> default-scheduler Successfully assigned default/nginx to server4
Normal Pulling 36s kubelet, server4 Pulling image "nginx"
Normal Pulled 36s kubelet, server4 Successfully pulled image "nginx"
Normal Created 35s kubelet, server4 Created container nginx
Normal Started 34s kubelet, server4 Started container nginx
3.交互式运行镜像
–restart=Never:表示退出即结束
[kubeadm@server2 ~]$ kubectl run test -it --image=busyboxplus --restart=Never
If you don't see a command prompt, try pressing enter.
/ # curl 10.244.2.4 # 可以访问nginx
<!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>
退出后结束test这个pod
[kubeadm@server2 ~]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 118s
test 0/1 Completed 0 58s
- 删除pod
[kubeadm@server2 ~]$ kubectl delete pod test
pod "test" deleted
[kubeadm@server2 ~]$ kubectl delete pod nginx
pod "nginx" deleted
- 自主式pod和部署pod的区别
运行nginx和myapp镜像(自主式pod)
[kubeadm@server2 ~]$ kubectl run nginx --image=nginx
pod/nginx created
[kubeadm@server2 ~]$ kubectl run myapp --image=myapp:v1
pod/myapp created
查看pod的运行状态
[kubeadm@server2 ~]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp 1/1 Running 0 20s
nginx 1/1 Running 0 62s
查看pod在的运行node(默认情况管理端不参加调度)
[kubeadm@server2 ~]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp 1/1 Running 0 41s 10.244.1.4 server3 <none> <none>
nginx 1/1 Running 0 83s 10.244.2.5 server4 <none> <none>
删除myapp
[kubeadm@server2 ~]$ kubectl delete pod myapp
pod "myapp" deleted
创建部署myapp
[kubeadm@server2 ~]$ kubectl create deployment myapp --image=myapp:v1
deployment.apps/myapp created
[kubeadm@server2 ~]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-7449b5b68f-pm5mn 0/1 ContainerCreating 0 7s
nginx 1/1 Running 0 14m
再次删除myapp会自动生成一个新的myapp(副本)
[kubeadm@server2 ~]$ kubectl delete pod myapp-7449b5b68f-pm5mn
pod "myapp-7449b5b68f-pm5mn" deleted
[kubeadm@server2 ~]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-7449b5b68f-ss8b8 1/1 Running 0 10s
nginx 1/1 Running 0 15m
[kubeadm@server2 ~]$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/myapp-7449b5b68f-pm5mn 1/1 Running 0 17s
pod/nginx 1/1 Running 0 14m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/myapp 1/1 1 1 17s
NAME DESIRED CURRENT READY AGE
replicaset.apps/myapp-7449b5b68f 1 1 1 17s
[kubeadm@server2 ~]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-7449b5b68f-pm5mn 1/1 Running 0 51s
- 对myapp做拉伸
[kubeadm@server2 ~]$ kubectl scale --replicas=2 deployment myapp
deployment.apps/myapp scaled
[kubeadm@server2 ~]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-7449b5b68f-n4k29 1/1 Running 0 8s
myapp-7449b5b68f-ss8b8 1/1 Running 0 5m28s
[kubeadm@server2 ~]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-7449b5b68f-n4k29 1/1 Running 0 41s 10.244.1.7 server3 <none> <none>
myapp-7449b5b68f-ss8b8 1/1 Running 0 6m1s 10.244.1.6 server3 <none> <none>
- 创建服务,内部访问pod
service是一个抽象概念,定义了一个服务的多个pod逻辑集合和访问pod的策略,一般把service称为服务。
[kubeadm@server2 ~]$ kubectl expose deployment myapp --port=80 --target-port=80
service/myapp exposed
[kubeadm@server2 ~]$ kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
myapp 2/2 2 2 16m
[kubeadm@server2 ~]$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13h
myapp ClusterIP 10.109.226.206 <none> 80/TCP 54s
[kubeadm@server2 ~]$ kubectl describe svc myapp
Name: myapp
Namespace: default
Labels: app=myapp
Annotations: <none>
Selector: app=myapp
Type: ClusterIP
IP: 10.109.226.206
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.6:80,10.244.1.7:80
Session Affinity: None
Events: <none>
[kubeadm@server2 ~]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-7449b5b68f-n4k29 1/1 Running 0 11m
myapp-7449b5b68f-ss8b8 1/1 Running 0 17m
[kubeadm@server2 ~]$ kubectl describe pod myapp-7449b5b68f-n4k29
Name: myapp-7449b5b68f-n4k29
Namespace: default
Priority: 0
Node: server3/172.25.60.3
Start Time: Sat, 18 Apr 2020 09:46:31 +0800
Labels: app=myapp
pod-template-hash=7449b5b68f
Annotations: <none>
Status: Running
IP: 10.244.1.7
IPs:
IP: 10.244.1.7
Controlled By: ReplicaSet/myapp-7449b5b68f
Containers:
myapp:
Container ID: docker://cc3ab38b43207687328c1110277bddbadfefbe8952dc317ab1733d20cc5fd035
Image: myapp:v1
Image ID: docker-pullable://myapp@sha256:9eeca44ba2d410e54fccc54cbe9c021802aa8b9836a0bcf3d3229354e4c8870e
Port: <none>
Host Port: <none>
State: Running
Started: Sat, 18 Apr 2020 09:46:35 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-64lq2 (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-64lq2:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-64lq2
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled <unknown> default-scheduler Successfully assigned default/myapp-7449b5b68f-n4k29 to server3
Normal Pulled 12m kubelet, server3 Container image "myapp:v1" already present on machine
Normal Created 12m kubelet, server3 Created container myapp
Normal Started 12m kubelet, server3 Started container myapp
测试:
访问clusterip
[kubeadm@server2 ~]$ kubectl run test -it --image=busyboxplus
If you don't see a command prompt, try pressing enter.
/ # curl 10.109.226.206
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
可以负载均衡
[kubeadm@server2 ~]$ kubectl attach test -it
/ # curl 10.109.226.206/hostname.html
myapp-7449b5b68f-ss8b8
/ # curl 10.109.226.206/hostname.html
myapp-7449b5b68f-n4k29
8 .使用nodeport类型暴露端口,让外部客户端访问pod
NodePort在clusterip基础上为services在每台机器上绑定一个端口,这样就可以通过nodeip:nodeport来访问该服务
方式一:kubectl edit svc myapp # 修改service的type为NodePort
[kubeadm@server2 ~]$ kubectl edit svc myapp
52 type: NodePort
方式二:kubectl expose deployment myapp --port=80 --target-poet=80 --type=NodePort
[kubeadm@server2 ~]$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-7449b5b68f-n4k29 1/1 Running 0 28m 10.244.1.7 server3 <none> <none>
myapp-7449b5b68f-ss8b8 1/1 Running 0 33m 10.244.1.6 server3 <none> <none>
test 1/1 Running 3 14m 10.244.2.6 server4 <none> <none>
对外提供端口31686
[kubeadm@server2 ~]$ kubectl get svc myapp
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myapp NodePort 10.109.226.206 <none> 80:31686/TCP 19m
[kubeadm@server2 ~]$ curl 172.25.60.3:31686
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[kubeadm@server2 ~]$ curl 172.25.60.3:31686/hostname.html
myapp-7449b5b68f-ss8b8
[kubeadm@server2 ~]$ curl 172.25.60.3:31686/hostname.html
myapp-7449b5b68f-n4k29
- 更新pod镜像和回滚
更新pod
[kubeadm@server2 ~]$ kubectl set image deployments myapp myapp=myapp:v2 --record
deployment.apps/myapp image updated
查看历史版本
[kubeadm@server2 ~]$ kubectl rollout history deployment myapp
deployment.apps/myapp
REVISION CHANGE-CAUSE
1 <none>
2 kubectl set image deployments myapp myapp=myapp:v2 --record=true
测试:
对外暴露端口31686
[kubeadm@server2 ~]$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13h
myapp NodePort 10.109.226.206 <none> 80:31686/TCP 32m
更新为v2版本
[kubeadm@server2 ~]$ curl 172.25.60.3:31686
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
回滚版本
[kubeadm@server2 ~]$ kubectl rollout undo deployment myapp --to-revision=1
deployment.apps/myapp rolled back
[kubeadm@server2 ~]$ curl 172.25.60.3:31686
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>