新建一个next-rc.yaml (以下是修改完的)
apiVersion: v1kind: ReplicationController #副本控制器RCmetadata:name: next-rc #RC名称,全局唯一spec:replicas: 3 #Pod副本的期待数量selector:app: next #符合目标的Pod拥有此标签template: #根据此模板创建Pod的副本(实例)metadata:labels:app: next #Pod副本拥有的标签,对应RC的Selectorspec:containers: #Pod内容器的定义部分- name: prophet-web #容器的名称image: prophet-web:laste #容器对应的Docker ImageimagePullPolicy: Never # 设置k8s从本地获取镜像ports:- containerPort: 80 #容器应用监听的端口号env: #注入容器内的环境变量# - name: MYSQL_ROOT_PASSWORD# value: "123456"resources: #定义资源分配requests: #最小资源量memory: "64Mi"cpu: "256m" #m是千分之一的CPU配额,通常100-300mlimits: #最大资源量memory: "128Mi"cpu: "500m"
发布到k8s集群
kubectl create -f ./next-rc.yaml
查看RC
查看Pod
kubectl get pods
可以看到会新建3个pod,在docker里面看到有3个新建的容器,
但是pod的状态是ImagePullBackOff
解决k8s默认从远程拉取镜像
删除RC
kubectl delete -f .\next-rc.yaml
重新发布修改完的rc

Dashbord查看
在mac上重新发布rc,所以名字pod名字跟上面不一样了
但是现在访问不到nextjs应用
创建next-service
apiVersion: v1kind: Service #表明是Kubernetes Servicemetadata:name: next-svc #Service的全局唯一名称spec:type: NodePort # 表明service开启NodePort方式的外网访问,默认不开启ports:- port: 80 #Service提供服务的端口号,如果没设置容器端口targetPort,则二者一致nodePort: 30001 # 跟type:NodePort对应,集群外访问使用该端口访问,对应到port:80这个端口selector: #Service对应的Pod拥有这里定义的标签app: next
发布service到k8s
Cluster-ip—集群内访问
会发现service都有对应的Cluster IP, 这是由k8s自动分配的
在k8s集群内部,就可以通过 ClusterIp+ port端口来访问对应服务
集群外访问
如果设置Type:NodePort, 则可以在集群外部,通过 NodeIp+nodePort 来访问对应服务
docker-desktop的启动的k8s是一个单节点集群,节点ip同mac本机
通过dashbord看到的ip不能访问
https://stackoverflow.com/questions/57021939/docker-for-desktop-runs-the-kubernetes-ip-address-is-not-working
http://localhost:30001/ 集群外访问
现在一个简单的通过k8s部署的应用就部署完成了,k8s会保持rc副本数量,当一个pod异常挂掉后,k8s会自动重新启动一个pod
动态缩放-修改rc副本数量
kubectl scale rc next-rc —replicas=5
滚动升级—ROlling Update
以后操作都是在已经启用istio的情况下,流量已经被接管,所以暴露容器端口和k8s ingress方式外部访问流量都没成功
创建Deployment
重新修改next应用容器的端口为30001
apiVersion: apps/v1#书中extensions/v1beta1的API版本不再提供Deployment,使用apps/v1#https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/kind: Deploymentmetadata:name: frontend-dpyspec:replicas: 2 #Pod副本的期待数量selector:matchLabels:app: next #符合目标的Pod拥有此标签template: #根据此模板创建Pod的副本(实例)metadata:labels:app: next #Pod副本拥有的标签,对应RC的Selectorannotations:sidecar.istio.io/inject: "false" #禁止istio自动注入sidecarspec:containers: #Pod内容器的定义部分- name: next-web #容器的名称image: next:first #容器对应的Docker ImageimagePullPolicy: Never # 设置k8s从本地获取镜像ports:- containerPort: 30001 #容器应用监听的端口号env: #注入容器内的环境变量# - name: MYSQL_ROOT_PASSWORD# value: "123456"resources: #定义资源分配requests: #最小资源量memory: "64Mi"cpu: "256m" #m是千分之一的CPU配额,通常100-300mlimits: #最大资源量memory: "128Mi"cpu: "500m"
因为容器禁止了istio自动注入,所以容器只能看到pause和next应用两种容器,
istio自动注入会产生第三种sidecar容器
重新部署service
修改了部分端口
apiVersion: v1kind: Service #表明是Kubernetes Servicemetadata:name: next-svc #Service的全局唯一名称spec:type: NodePort # 表明service开启NodePort方式的外网访问ports:- port: 8080 #Service提供服务的端口号,targetPort: 30001 # ]应用容器监听的的端口号nodePort: 32000 # 跟type:NodePort对应,集群外访问使用该端口访问,对应到port:8080这个端口selector: #Service对应的Pod拥有这里定义的标签app: next
外部通过Nodeport方式访问集群内部service,可能因为istio ingress的原因,访问失败
创建Ingress
先创ingress controller
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml
Ingress策略资源
apiVersion: extensions/v1beta1kind: Ingressmetadata:name: test-ingressspec:backend:serviceName: next-svcservicePort: 8080#对Ingress Controller的访问请求都将被转发到myweb:8080这个服务



