新建一个next-rc.yaml (以下是修改完的)
apiVersion: v1
kind: ReplicationController #副本控制器RC
metadata:
name: next-rc #RC名称,全局唯一
spec:
replicas: 3 #Pod副本的期待数量
selector:
app: next #符合目标的Pod拥有此标签
template: #根据此模板创建Pod的副本(实例)
metadata:
labels:
app: next #Pod副本拥有的标签,对应RC的Selector
spec:
containers: #Pod内容器的定义部分
- name: prophet-web #容器的名称
image: prophet-web:laste #容器对应的Docker Image
imagePullPolicy: Never # 设置k8s从本地获取镜像
ports:
- containerPort: 80 #容器应用监听的端口号
env: #注入容器内的环境变量
# - name: MYSQL_ROOT_PASSWORD
# value: "123456"
resources: #定义资源分配
requests: #最小资源量
memory: "64Mi"
cpu: "256m" #m是千分之一的CPU配额,通常100-300m
limits: #最大资源量
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: v1
kind: Service #表明是Kubernetes Service
metadata:
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: Deployment
metadata:
name: frontend-dpy
spec:
replicas: 2 #Pod副本的期待数量
selector:
matchLabels:
app: next #符合目标的Pod拥有此标签
template: #根据此模板创建Pod的副本(实例)
metadata:
labels:
app: next #Pod副本拥有的标签,对应RC的Selector
annotations:
sidecar.istio.io/inject: "false" #禁止istio自动注入sidecar
spec:
containers: #Pod内容器的定义部分
- name: next-web #容器的名称
image: next:first #容器对应的Docker Image
imagePullPolicy: Never # 设置k8s从本地获取镜像
ports:
- containerPort: 30001 #容器应用监听的端口号
env: #注入容器内的环境变量
# - name: MYSQL_ROOT_PASSWORD
# value: "123456"
resources: #定义资源分配
requests: #最小资源量
memory: "64Mi"
cpu: "256m" #m是千分之一的CPU配额,通常100-300m
limits: #最大资源量
memory: "128Mi"
cpu: "500m"
因为容器禁止了istio自动注入,所以容器只能看到pause和next应用两种容器,
istio自动注入会产生第三种sidecar容器
重新部署service
修改了部分端口
apiVersion: v1
kind: Service #表明是Kubernetes Service
metadata:
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/v1beta1
kind: Ingress
metadata:
name: test-ingress
spec:
backend:
serviceName: next-svc
servicePort: 8080
#对Ingress Controller的访问请求都将被转发到myweb:8080这个服务