kubernetes-pod
pod管理
Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip
创建pod并查看相关信息
[root@server2 ~]# kubectl run demo --image=myapp:v1
pod/demo created
[root@server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 5s
[root@server2 ~]# kubectl describe pod demo
Name: demo
Namespace: default
Priority: 0
Node: server4/172.25.12.4
Start Time: Mon, 26 Jul 2021 22:24:09 -0400
Labels: run=demo
Annotations: <none>
Status: Running
IP: 10.244.6.2
IPs:
IP: 10.244.6.2
Containers:
demo:
Container ID: docker://30e1ffe2d7729b3e9bed5690bfe6fcbe888079f5ff430392b7454bfd035f3234
Image: myapp:v1
Image ID: docker-pullable://myapp@sha256:9eeca44ba2d410e54fccc54cbe9c021802aa8b9836a0bcf3d3229354e4c8870e
Port: <none>
Host Port: <none>
State: Running
Started: Mon, 26 Jul 2021 22:24:12 -0400
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-jgdb6 (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-jgdb6:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 32s default-scheduler Successfully assigned default/demo to server4
Normal Pulling 32s kubelet Pulling image "myapp:v1"
Normal Pulled 30s kubelet Successfully pulled image "myapp:v1" in 1.480562823s
Normal Created 30s kubelet Created container demo
Normal Started 30s kubelet Started container demo
查看flannel环境
[root@server2 ~]# cd /var/run/flannel/
[root@server2 flannel]# cat subnet.env
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
[root@server2 flannel]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo 1/1 Running 0 2m7s 10.244.6.2 server4 <none> <none>
[root@server2 flannel]# curl 10.244.6.2
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
集群会自动创建Pod
[root@server2 ~]# kubectl delete pod demo
pod "demo-5b4fc8bb88-d5fvx" deleted
[root@server2 ~]# kubectl create deployment demo --image=myapp:v1 --replicas=2
deployment.apps/demo created
[root@server2 flannel]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo 1/1 Running 0 4m19s 10.244.6.2 server4 <none> <none>
demo-5b4fc8bb88-l4pcw 1/1 Running 0 6s 10.244.5.5 server3 <none> <none>
demo-5b4fc8bb88-zx7jl 1/1 Running 0 6s 10.244.5.4 server3 <none> <none>
[root@server2 flannel]# kubectl delete pod demo
pod "demo" deleted
[root@server2 flannel]# kubectl delete pod demo-5b4fc8bb88-l4pcw
pod "demo-5b4fc8bb88-l4pcw" deleted
[root@server2 flannel]# kubectl delete pod demo-5b4fc8bb88-zx7jl
pod "demo-5b4fc8bb88-zx7jl" deleted
[root@server2 flannel]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-5b4fc8bb88-cztkh 1/1 Running 0 40s 10.244.6.3 server4 <none> <none>
demo-5b4fc8bb88-hvqkq 1/1 Running 0 24s 10.244.5.6 server3 <none> <none>
kubectl delete deployment nginx //彻底删除
使用NodePort类型暴露端口,让外部客户端访问Pod
[root@server2 flannel]# kubectl expose deployment demo --port=80 --target-port=80
service/demo exposed
[root@server2 flannel]# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/demo-5b4fc8bb88-cztkh 1/1 Running 0 4m31s
pod/demo-5b4fc8bb88-hvqkq 1/1 Running 0 4m15s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/demo ClusterIP 10.101.211.24 <none> 80/TCP 14s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d16h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/demo 2/2 2 2 6m32s
NAME DESIRED CURRENT READY AGE
replicaset.apps/demo-5b4fc8bb88 2 2 2 6m32s
负载均衡
[root@server2 flannel]# curl 10.101.211.24
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server2 flannel]# curl 10.101.211.24/hostname.html
demo-5b4fc8bb88-cztkh
[root@server2 flannel]# curl 10.101.211.24/hostname.html
demo-5b4fc8bb88-cztkh
[root@server2 flannel]# curl 10.101.211.24/hostname.html
demo-5b4fc8bb88-cztkh
[root@server2 flannel]# curl 10.101.211.24/hostname.html
demo-5b4fc8bb88-hvqkq
[root@server2 flannel]# curl 10.101.211.24/hostname.html
demo-5b4fc8bb88-hvqkq
查看service demo的信息
Name: demo
Namespace: default
Labels: app=demo
Annotations: <none>
Selector: app=demo
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.102.41.19
IPs: 10.102.41.19
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.141.195:80,10.244.141.196:80
Session Affinity: None
Events: <none>
查看rs的信息
[root@server2 ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
demo-5b4fc8bb88 2 2 2 2m22s
Pod扩容与缩容
[root@server2 ~]# kubectl scale deployment demo --replicas=6
deployment.apps/demo scaled
[root@server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo-5b4fc8bb88-b5jdk 1/1 Running 0 9s
demo-5b4fc8bb88-hws5l 1/1 Running 0 9s
demo-5b4fc8bb88-jmjj5 1/1 Running 0 83m
demo-5b4fc8bb88-pfvgl 1/1 Running 0 9s
demo-5b4fc8bb88-zc4m9 1/1 Running 0 83m
demo-5b4fc8bb88-zl2q6 1/1 Running 0 9s
[root@server2 ~]# kubectl scale deployment demo --replicas=2
deployment.apps/demo scaled
[root@server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo-5b4fc8bb88-jmjj5 1/1 Running 0 83m
demo-5b4fc8bb88-zc4m9 1/1 Running 0 83m
更新镜像
[root@server2 ~]# kubectl set image deployment demo myapp=myapp:v2
deployment.apps/demo image updated
[root@server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo-7bd47bddfc-7kgvd 1/1 Running 0 2m52s
demo-7bd47bddfc-qb9q6 1/1 Running 0 42s
[root@server2 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-7bd47bddfc-7kgvd 1/1 Running 0 3m49s 10.244.141.201 server3 <none> <none>
demo-7bd47bddfc-qb9q6 1/1 Running 0 99s 10.244.141.202 server3 <none> <none>
myapp-deployment-59dff4cf5d-27bfp 1/1 Running 0 22h 10.244.5.36 server3 <none> <none>
myapp-deployment-59dff4cf5d-7d5nk 1/1 Running 0 22h 10.244.5.37 server3 <none> <none>
myapp-deployment-59dff4cf5d-bb8w8 1/1 Running 0 22h 10.244.5.35 server3 <none> <none>
[root@server2 ~]# curl 10.244.141.201
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
版本回滚
[root@server2 ~]# kubectl rollout undo deployment demo --to-revision=1
deployment.apps/demo rolled back
[root@server2 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-5b4fc8bb88-8knth 1/1 Running 0 21s 10.244.141.204 server3 <none> <none>
demo-5b4fc8bb88-9f42m 1/1 Running 0 24s 10.244.141.203 server3 <none> <none>
[root@server2 ~]# curl 10.244.141.204
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
资源清单
在k8s中,一般使用yaml格式的文件来创建符合我们预期期望的pod,这样的yaml文件我们一般称为资源清单
想查看全部属性,可以使用命令
kubectl explain pod
创建
[root@server2 ~]# cd pod/
[root@server2 pod]# vim pod.yaml
[root@server2 pod]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
tty: true
stdin: true
[root@server2 pod]# kubectl apply -f pod.yaml
pod/pod-example created
[root@server2 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-example 1/1 Running 0 9s
资源清单可以一次性创建多个容器
[root@server2 pod]# vim pod.yaml
[root@server2 pod]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
- name: busybox
image: busyboxplus:latest
tty: true
stdin: true
[root@server2 pod]# kubectl delete -f pod.yaml
pod "pod-example" deleted
[root@server2 pod]#
[root@server2 pod]# kubectl apply -f pod.yaml
pod/pod-example created
[root@server2 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-example 2/2 Running 0 3m28s
容器可以互通
[root@server2 pod]# kubectl attach pod-example -c busybox -it
If you don't see a command prompt, try pressing enter.
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: eth0@if59: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 82:a8:33:ba:2e:dd brd ff:ff:ff:ff:ff:ff
inet 10.244.141.207/32 brd 10.244.141.207 scope global eth0
valid_lft forever preferred_lft forever
/ # curl localhost
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
/ #
指定部署主机
指定server4进行部署
[root@server2 pod]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
nodeName: server4
containers:
- name: myapp
image: myapp:v1
- name: busybox
image: busyboxplus:latest
tty: true
stdin: true
[root@server2 pod]# kubectl delete -f pod.yaml
pod "pod-example" deleted
[root@server2 pod]# kubectl apply -f pod.yaml
pod/pod-example created
[root@server2 pod]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-example 2/2 Running 0 27s 10.244.22.0 server4 <none> <none>