实际项目参考
K8s
本地链接k8s

新建一个next-rc.yaml (以下是修改完的)

  1. apiVersion: v1
  2. kind: ReplicationController #副本控制器RC
  3. metadata:
  4. name: next-rc #RC名称,全局唯一
  5. spec:
  6. replicas: 3 #Pod副本的期待数量
  7. selector:
  8. app: next #符合目标的Pod拥有此标签
  9. template: #根据此模板创建Pod的副本(实例)
  10. metadata:
  11. labels:
  12. app: next #Pod副本拥有的标签,对应RC的Selector
  13. spec:
  14. containers: #Pod内容器的定义部分
  15. - name: prophet-web #容器的名称
  16. image: prophet-web:laste #容器对应的Docker Image
  17. imagePullPolicy: Never # 设置k8s从本地获取镜像
  18. ports:
  19. - containerPort: 80 #容器应用监听的端口号
  20. env: #注入容器内的环境变量
  21. # - name: MYSQL_ROOT_PASSWORD
  22. # value: "123456"
  23. resources: #定义资源分配
  24. requests: #最小资源量
  25. memory: "64Mi"
  26. cpu: "256m" #m是千分之一的CPU配额,通常100-300m
  27. limits: #最大资源量
  28. memory: "128Mi"
  29. cpu: "500m"

发布到k8s集群

kubectl create -f ./next-rc.yaml

查看RC

kubectl get rc

查看Pod

kubectl get pods
image.png
可以看到会新建3个pod,在docker里面看到有3个新建的容器,
但是pod的状态是ImagePullBackOff
image.png
image.png

解决k8s默认从远程拉取镜像

image.png
image.png

删除RC

kubectl delete -f .\next-rc.yaml

重新发布修改完的rc

image.png

Dashbord查看

在mac上重新发布rc,所以名字pod名字跟上面不一样了
image.png
但是现在访问不到nextjs应用

创建next-service

  1. apiVersion: v1
  2. kind: Service #表明是Kubernetes Service
  3. metadata:
  4. name: next-svc #Service的全局唯一名称
  5. spec:
  6. type: NodePort # 表明service开启NodePort方式的外网访问,默认不开启
  7. ports:
  8. - port: 80 #Service提供服务的端口号,如果没设置容器端口targetPort,则二者一致
  9. nodePort: 30001 # 跟type:NodePort对应,集群外访问使用该端口访问,对应到port:80这个端口
  10. selector: #Service对应的Pod拥有这里定义的标签
  11. app: next

发布service到k8s

image.png
发布成功后,查看
image.png
image.png

Cluster-ip—集群内访问

会发现service都有对应的Cluster IP, 这是由k8s自动分配的
在k8s集群内部,就可以通过 ClusterIp+ port端口来访问对应服务

集群外访问

如果设置Type:NodePort, 则可以在集群外部,通过 NodeIp+nodePort 来访问对应服务
docker-desktop的启动的k8s是一个单节点集群,节点ip同mac本机
通过dashbord看到的ip不能访问
image.png
https://stackoverflow.com/questions/57021939/docker-for-desktop-runs-the-kubernetes-ip-address-is-not-working
image.png
http://localhost:30001/ 集群外访问
image.png
现在一个简单的通过k8s部署的应用就部署完成了,k8s会保持rc副本数量,当一个pod异常挂掉后,k8s会自动重新启动一个pod

动态缩放-修改rc副本数量

kubectl scale rc next-rc —replicas=5
image.png

滚动升级—ROlling Update

以后操作都是在已经启用istio的情况下,流量已经被接管,所以暴露容器端口和k8s ingress方式外部访问流量都没成功

创建Deployment

重新修改next应用容器的端口为30001

  1. apiVersion: apps/v1
  2. #书中extensions/v1beta1的API版本不再提供Deployment,使用apps/v1
  3. #https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/
  4. kind: Deployment
  5. metadata:
  6. name: frontend-dpy
  7. spec:
  8. replicas: 2 #Pod副本的期待数量
  9. selector:
  10. matchLabels:
  11. app: next #符合目标的Pod拥有此标签
  12. template: #根据此模板创建Pod的副本(实例)
  13. metadata:
  14. labels:
  15. app: next #Pod副本拥有的标签,对应RC的Selector
  16. annotations:
  17. sidecar.istio.io/inject: "false" #禁止istio自动注入sidecar
  18. spec:
  19. containers: #Pod内容器的定义部分
  20. - name: next-web #容器的名称
  21. image: next:first #容器对应的Docker Image
  22. imagePullPolicy: Never # 设置k8s从本地获取镜像
  23. ports:
  24. - containerPort: 30001 #容器应用监听的端口号
  25. env: #注入容器内的环境变量
  26. # - name: MYSQL_ROOT_PASSWORD
  27. # value: "123456"
  28. resources: #定义资源分配
  29. requests: #最小资源量
  30. memory: "64Mi"
  31. cpu: "256m" #m是千分之一的CPU配额,通常100-300m
  32. limits: #最大资源量
  33. memory: "128Mi"
  34. cpu: "500m"

因为容器禁止了istio自动注入,所以容器只能看到pause和next应用两种容器,
istio自动注入会产生第三种sidecar容器
image.png

重新部署service

修改了部分端口

  1. apiVersion: v1
  2. kind: Service #表明是Kubernetes Service
  3. metadata:
  4. name: next-svc #Service的全局唯一名称
  5. spec:
  6. type: NodePort # 表明service开启NodePort方式的外网访问
  7. ports:
  8. - port: 8080 #Service提供服务的端口号,
  9. targetPort: 30001 # ]应用容器监听的的端口号
  10. nodePort: 32000 # 跟type:NodePort对应,集群外访问使用该端口访问,对应到port:8080这个端口
  11. selector: #Service对应的Pod拥有这里定义的标签
  12. app: next

外部通过Nodeport方式访问集群内部service,可能因为istio ingress的原因,访问失败
image.png

创建Ingress

先创ingress controller

使用 Nginx Ingress Controller

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml

image.png

Ingress策略资源

  1. apiVersion: extensions/v1beta1
  2. kind: Ingress
  3. metadata:
  4. name: test-ingress
  5. spec:
  6. backend:
  7. serviceName: next-svc
  8. servicePort: 8080
  9. #对Ingress Controller的访问请求都将被转发到myweb:8080这个服务