新增配置yaml配置文件
# 创建一个service资源对象 # kubectl expose deployment xxName –port=80 –target-port=80 k8s指令模式创建一个service # k8s部署yaml方式 apiVersion: v1 kind: Service metadata: name: nginx namespace: default spec: selector: app: nginx ports: - port: 80 targetPort: 80 --- # 部署deployment对象,k8s创建3个资源对象:Deployment,ReplicaSet,POD apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: default spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.16 ports: - containerPort: 80
执行配置文件,生成deployment和service
kubectl apply -f ingres.yaml
执行后查看deployment、service、rs、pod的情况(注意:这一步一般时间比较久,需要等一会)
扩容命令
kubectl scale deployment nginx --replicas=3
从上图可以看到,执行扩容后,直接变为3个副本。
可以做一个模拟,直接删除一个或多个pod,K8S会自动重新创建指定数量的副本,保证pod数量与副本数量一致
kubectl delete pod nginx-6fcfdd4c87-5rwdz
从get service图片的输出中可以看到,nginx的type为ClusterIp,这种类型的service只能在集群内部访问,而不能在外部直接访问,那么就需要修改类型为NodePort,修改命令:
kubectl edit svc nginx
更改完毕之后,重新查看service,发现type已经变为NodePort,且port也变更了,前面的80是容器内的端口,后面的31758是对外开放的端口,也就是宿主机的端口。
此时,使用宿主机的ip + 31758访问,即可访问nginx
Dns可以根据服务名称寻址响应的服务的ip地址;从而可以通过服务名称和对应的服务进行通信; 在微服务架构中服务部署非常有用;
DNS: 域名解析服务器,可以根据hostname解析出服务对应ip; 可以根据服务名称发现服务。
进入容器内部,ping服务名即可演示:
首先创建两个服务,分别为nginx和nginx-lcl
进入nginx的一个容器:kubectl exec -it pod名称 sh
kubectl exec -it nginx-79fb9cc9bb-qhqm7 sh
然后再容器中ping另一个服务的服务名
可以看到直接ping的地址就是10.109.171.91,对应的就是上面图中nginx-lcl的IP。
说明:如果在容器内不能使用ping命令,执行下面这两个命令即可。
apt-get update apt install iputils-ping
在实际生产中,这个用场景主要是:不需要借助注册中心,直接使用服务名进行访问,也就是不需要通过类似Spring Cloud的注册中心和负载均衡来处理,在代码中直接调用服务名,让K8S来做负载均衡。
项目开发时候,需求不断迭代,变更;发布新的版本,使用新的镜像版本进行部署;在K8S中 可以指定新的版本,一键式发布项目;更新项目版本。
kubectl set image deployment/nginx-lcl nginx-lcl=nginx:v2
对命令做个解释,就是需要重置一下deployment中镜像的地址,上面的命令中,新的镜像地址为nginx:v2,这里可以是镜像仓库中的一个镜像地址。