Kubernetes基础使用以及网络分析

1 基础操作

1.1 Pod

1
2
3
4
5
6
7
8
9
#查看Pod详情信息
kubectl describe pod pod-name -n ns

#Status
挂起(Pending):Pod已被K8s系统接受,但有一个或多个容器镜像尚未创建,等待时间包括调度Pod的时间和通过网络下载镜像的时间,着可能需要花点时间。
运行中(Running):Pod已经绑定到了一个节点上,Pod中所有的容器都已被创建,至少有一个容器正在运行,或者正处于启动或重启状态。
成功(Successed):Pod中的所有容器都被成功终止,并且不会再次重启。
失败(Failed):Pod中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
未知(Unknown):因为某些原因无法取得Pod的状态,通常是因为与Pod所在主机通信失败。

1.2 ReplicaSet(RS)

https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/

(1)创建frontend.yaml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
aapiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
# modify replicas according to your case
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3

(2)常见操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#创建Pod
kubectl apply -f frontend.yaml

#查看Pod
kubectl get pods
kubectl get pods -o wide

#查看rs资源
kubectl get rs
kubectl describe rs frontend

#对Pod进行扩缩容
kubectl scale rs frontend --replicas=5

#删除单个Pod
kubectl delete pods frontendd-21tc9

#删除rs
kubectl delete -f frontend.yaml

1.3 Deployment

(1)创建nginx-deployment.yaml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80

(2)常见操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 创建Pod
kubectl apply -f nginx-deployment.yaml

# 查看Pod
kubectl get pods
kubectl get pods -o wide

# 查看deployment资源
kubectl get deploy
kubectl describe deploy nginx-deployment

# 对Pod进行扩缩容
kubectl scale deploy nginx-deployment --replicas=5

# 删除单个Pod
kubectl delete pods nginx-deployment-9456bbbf9-77ljp

# 删除rs
kubectl delete -f nginx-deployment.yaml

# 查看当前nginx的版本
kubectl get deploy -o wide

# 更新nginx的版本为1.16.1
kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1
kubectl get deploy -o wide

1.4 Label and Selector

https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
# 表示该deployment具有一个label,key为app,value为nginx,可以通过kubectl getdeploy --show-labels 查看
app: nginx
spec:
replicas: 3
selector: # 表示该deployment管理的Pod匹配条件,而这个条件是根据label进行匹配的
matchLabels:
app: nginx
template: # 定义一个Pod的模板
metadata:
labels:
app: nginx # 表示该pod具有一个label,key为app,value为nginx,可以通过kubectl get pods --show-labels 查看
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80

1.5 Namespace

https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/

1
2
3
4
5
6
7
#查看命名空间
kubectl get namespace
kubectl get ns

#创建命名空间
kubectl create namespace test-ns
kubectl get ns
1
2
3
4
5
6
7
8
9
10
11
12
#定义podyaml:nginx-pod-ns.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: jack-ns
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
1
2
3
4
5
6
7
8
#构建Pod
kubectl apply -f nginx-pod-ns.yaml

#查看指定命名空间下的资源
kubectl get pods
kubectl get pods -n test-ns
kubectl get all -n test-ns
kubectl get pods --all-namespaces

2 Network

2.1 Pod Network

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建两个Pod
kubectl run nginx --image=nginx
kubectl run tomcat --image=tomcat:8.0
# 查看两个Pod详情
kubectl get pods -o wide
# 结果输出
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 2m 10.244.190.76 w1 <none> <none>
tomcat 1/1 Running 0 17s 10.244.80.205 w2 <none> <none>
# 任意一台node访问pod_ip
curl 10.244.190.76
curl 10.244.80.205:8080
# 进入nginx pod中访问tomcat pod
kubectl exec -it nginx bash
curl 10.244.80.205:8080
# 进入tomcat pod中访问物理机
kubectl exec -it tomcat bash
ping 192.168.0.52
ping 192.168.0.53

在K8s Cluster中,通过Calico网络插件,可以实现Node访问Pod、Pod之间通信以及Pod访问 Node

2.2 Service

对于上述的Pod虽然实现了集群内部互相通信,但是Pod是不稳定的,比如通过Deployment管理 Pod,随时可能对Pod进行扩缩容,这时候Pod的IP地址是变化的。能够有一个固定的IP,使得集群内能够访问。也就是之前在架构描述的时候所提到的,能够把相同或者具有关联的Pod,打上Label,组成 Service。而Service有固定的IP,不管Pod怎么创建和销毁,都可以通过Service的IP进行访问。

https://kubernetes.io/docs/concepts/services-networking/service/

2.2.1 ClusterIP

(1)创建whoami-deployment.yaml文件,并且apply

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami-deployment
labels:
app: whoami
spec:
replicas: 3
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: jwilder/whoami
ports:
- containerPort: 8000

(2)查看pod以及service

1
2
kubectl get pods -o wide
kubectl get service

(3)通过pod_ip进行访问

1
curl pod_ip:8000

(4)创建whoami pod的service,定义whoami-serivce.yaml文件

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
name: whoami-service
spec:
selector:
app: whoami
ports:
- protocol: TCP
port: 80
targetPort: 8000
type: ClusterIP

(5)查看service

1
2
kubectl get service
kubectl describe service whoami-service

(6)访问service

1
2
curl service_ip
while sleep 0.2; do curl service_ip; done;

(7)对pod进行扩容,然后再次访问

1
2
3
kubectl scale deployment whoami-deployment --replicas=5
kubectl get pods
while sleep 0.2; do curl service_ip; done;

2.2.2 NodePort

因为外部能够访问到集群的物理机器IP,所以就是在集群中每台物理机器上暴露一个相同的 IP,比如32008

(1)修改whoami-service.yaml文件中的类型为NodePort

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Service
metadata:
name: whoami-service
spec:
selector:
app: whoami
ports:
- protocol: TCP
port: 80
targetPort: 8000
nodePort: 32008 # 可以指定一个物理机上不重复的端口,范围在20000-40000之间
type: NodePort # 把ClusterIP修改成NodePort

(2)查看service

1
2
kubectl get service
kubectl describe service whoami-service

(3)访问测试

1
curl centos_ip:32008

2.2.3 Ingress

(1)创建tomcat pod和tomcat service,定义在tomcat.yaml文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deployment
labels:
app: tomcat
spec:
replicas: 1
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:8.0
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: tomcat

(2)运行tomcat.yaml并查看

1
2
3
4
5
kubectl apply -f tomcat.yaml
kubectl get svc
kubectl get pods
curl tomcat-pod_ip:8080
curl tomcat-service_ip

(3)以Deployment Pod的方式创建Nginx Ingress Controller,文件名称为nginx-ingresscontroller.yaml

文件内容:https://kubernetes.github.io/ingress-nginx/deploy/#quick-start

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 给w1添加label,这样在nginx-ingress-controller.yaml中搜索"nodeSelector"时,就可以根据name: ingress进行匹配了
kubectl label node w1 name=ingress
kubectl get nodes --show-labels
kubectl get node w1 --show-labels
# 在nginx-ingress-controller.yaml中添加一行配置,可以在nodeSelector上面一行添加
hostNetwork: true
# 将nginx-ingress-controller.yaml中的3个image替换成阿里镜像仓库中的内容
registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/ingress-nginx-controller
registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/kube-webhook-certgen
registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/kube-webhook-certgen
# 运行yaml文件
kubectl apply -f nginx-ingress-controller.yaml
# 这样w1上的80和443端口就会被nginx-ingress-controller使用
lsof -i:80
lsof -i:443
# 查看资源
kubectl get pods -n ingress-nginx -o wide
kubectl get all -n ingress-nginx

(4)定义ingress规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
spec:
rules:
- host: tomcat.jack.tomcat
http:
paths:
- path: /
backend:
serviceName: tomcat-service
servicePort: 80

(5)应用并查看ingress规则

1
2
3
4
5
kubectl apply -f nginx-ingress.yaml
kubectl get ingress
kubectl describe ingress nginx-ingress
kubectl get service
kubectl get pods

(6)在win上配置hosts文件

1
192.168.0.52 tomcat.jack.com

(7)访问tomcat.jack.com


Kubernetes基础使用以及网络分析
http://www.zivjie.cn/2023/04/28/云原生(容器化)/k8s/Kubernetes基础使用以及网络分析/
作者
Francis
发布于
2023年4月28日
许可协议