1 基础操作
1.1 Pod
1 2 3 4 5 6 7 8 9
| kubectl describe pod pod-name -n ns
挂起(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: 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
| kubectl apply -f frontend.yaml
kubectl get pods kubectl get pods -o wide
kubectl get rs kubectl describe rs frontend
kubectl scale rs frontend --replicas=5
kubectl delete pods frontendd-21tc9
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
| kubectl apply -f nginx-deployment.yaml
kubectl get pods kubectl get pods -o wide
kubectl get deploy kubectl describe deploy nginx-deployment
kubectl scale deploy nginx-deployment --replicas=5
kubectl delete pods nginx-deployment-9456bbbf9-77ljp
kubectl delete -f nginx-deployment.yaml
kubectl get deploy -o wide
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: 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
|
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
| 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
| 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
| kubectl run nginx --image=nginx kubectl run tomcat --image=tomcat:8.0
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>
curl 10.244.190.76 curl 10.244.80.205:8080
kubectl exec -it nginx bash curl 10.244.80.205:8080
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进行访问
(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 type: NodePort
|
(2)查看service
1 2
| kubectl get service kubectl describe service whoami-service
|
(3)访问测试
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
| kubectl label node w1 name=ingress kubectl get nodes --show-labels kubectl get node w1 --show-labels
hostNetwork: true
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
kubectl apply -f nginx-ingress-controller.yaml
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
| 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