环境信息
Master:172.17.157.115(内网IP)
Node1:172.17.157.114(内网IP)
部署信息参考:《MacOS 系统使用 kubeasz 搭建 k8s 测试集群》
创建一个 Deployment
Deployment 用来声明式地定义应用的组件和运行次数,它会持续监控运行的Pod,保证其数目和模板的定义一致,例如当 Pod 崩溃时会自动创建,它是 Kubernetes 中部署和运行容器化应用的推荐方式,可以和服务发现、扩缩容、滚动升级等功能很好地结合。
使用 gcr.io/google-samples/hello-app:1.0 基础镜像
$ kubectl create deployment hello-world --image=gcr.io/google-samples/hello-app:1.0
查看创建的 Deployment
$ kubectl get deployments
# 查看详细信息
$ kubectl describe deployment hello-world
# 删除 deployment
kubectl delete deployment hello-world
Deployment 创建后会自动创建指定数量的 Pod,本例命令未指定则默认一个 Pod
查看创建的 Pod
Pod 是 Kubernetes 中可以创建和管理的最小的基本执行单元,是一组容器的集合。
Pod 中的容器共享网络和存储资源,可以通过 localhost 通信。
每个 Pod 会被分配一个唯一的 IP 地址,可以进行水平扩展复制,支持同一类 Pod 的多个实例同时运行。
Pod可以跨Node调度运行,Kubernetes会自动处理调度和重启。
应用开发以Pod中的容器为主,Pod负责管理容器的生命周期。
$ kubectl get pods -o wide
从输出可以看到 Pod 的 IP 地址是 172.20.253.7,部署节点是 172.17.157.115(Master 内网地址)
调用刚部署的服务接口
$ curl 172.20.253.7:8080
输出
Hello, world!
Version: 1.0.0
Hostname: hello-world-5bc74c8b8d-kt5kk
直接请求 Pod 实例的 IP 地址没有负载均衡,当 Service 中存在多个 Pods 时需要使用集群 IP 访问服务。
创建 Service(暴露 Deployment)
我们先更新下之前创建的 Deployment,将 replicas: 1
修改为 replicas: 2
后保存
$ kubectl edit deployment hello-world
再次查看 Deployment 和 Pods 数量,可见变成了 2 个服务实例(PS:一个在 Master,一个在 Node1 节点)
接下来基于现有 Deployment 快速创建 Service
$ kubectl expose deployment hello-world --type=NodePort --port=8123 --target-port=8080
查看 Service 状态 kubectl get svc
即(kubectl get service)
集群 IP 为 10.68.164.91,通过 10.68.164.91:8123
即可访问到服务,多次请求 Service 接口,可见 Pods 能够负载均衡。
同时,在内网通过 172.17.157.115:30005
以及外网通过 http://<服务器外网IP>:30005
都可以访问到服务
从部署后的 Grafana 面板也可以看到刚创建的 Pods 已经有了指标信息
使用配置文件启动
在增加更多的配置参数时通过命令行运行的命令不好进行版本控制,推荐使用配置文件的方式管理
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world
spec:
replicas: 3
selector:
matchLabels:
app: hello-world
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: gcr.io/google-samples/hello-app:1.0
resources:
limits:
cpu: "256m"
memory: "256Mi"
service.yaml
apiVersion: v1
kind: Service
metadata:
name: hello-world
spec:
type: NodePort
ports:
- port: 8123
targetPort: 8080
# nodePort: 30123
selector:
app: hello-world
启动命令
$ kubectl apply -f deployment.yaml -f service.yaml
编辑修改 Pods 数量后,重复运行命令即可。