Shawn's Blog
蒸汽兔
初探k8s-通过资源文件部署应用(三)
字数:452 字
阅读时长:约 2 分钟
阅读次
概述
我们知道通过 run
命令启动容器非常麻烦,Docker 提供了 Compose 为我们解决了这个问题。那 Kubernetes 是如何解决这个问题的呢?其实很简单,使用 kubectl apply
命令就可以做到和 Compose 一样的效果了,该命令可以通过配置文件快速创建一个集群资源对象
部署 Deployment
创建一个名为 nginx.yaml
的配置文件
# API 版本号
apiVersion: apps/v1
# 类型,如:Pod/ReplicationController/Deployment/Service/Ingress
kind: Deployment
metadata:
# Kind 的名称
name: nginx-app
spec:
selector:
matchLabels:
# 容器标签的名字,发布 Service 时,selector 需要和这里对应
app: nginx
# 部署的实例数量
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
# 配置容器,数组类型,说明可以配置多个容器
containers:
# 容器名称
- name: nginx
# 容器镜像
image: nginx:1.17
# 只有镜像不存在时,才会进行镜像拉取
imagePullPolicy: IfNotPresent
ports:
# Pod 端口
- containerPort: 80
发布 Service
在 nginx.yaml
配置文件中追加如下配置
# 不要忘记这里的三条横线
---
# API 版本号
apiVersion: v1
# 类型,如:Pod/ReplicationController/Deployment/Service/Ingress
kind: Service
# 元数据
metadata:
# Kind 的名称
name: nginx-http
spec:
# 暴露端口
ports:
# Service 暴露的端口
- port: 80
# Pod 上的端口,这里是将 Service 暴露的端口转发到 Pod 端口上
targetPort: 80
# 类型
type: LoadBalancer
# 标签选择器
selector:
# 需要和上面部署的 Deployment 标签名对应
app: nginx
# 部署
kubectl apply -f nginx.yaml
# 删除
kubectl delete -f nginx.yaml
镜像拉取策略说明
支持三种 ImagePullPolicy
- Always: 不管镜像是否存在都会进行一次拉取
- Never: 不管镜像是否存在都不会进行拉取
- IfNotPresent: 只有镜像不存在时,才会进行镜像拉取
注意
- 默认为
IfNotPresent
,但:latest
标签的镜像默认为Always
- 拉取镜像时 Docker 会进行校验,如果镜像中的 MD5 码没有变,则不会拉取镜像数据
- 生产环境中应该尽量避免使用
:latest
标签,而开发环境中可以借助:latest
标签自动拉取最新的镜像
验证是否生效
查看 Pod 列表
kubectl get pods
# 输出如下
NAME READY STATUS RESTARTS AGE
nginx-app-798dcc9989-xh6t5 1/1 Running 0 111s
nginx-app-798dcc9989-xvqpd 1/1 Running 0 111s
查看 Deployment 列表
kubectl get deployment
# 输出如下
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-app 2/2 2 2 2m11s
查看 Service 列表
kubectl get service
# 输出如下
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 86m
nginx-http LoadBalancer 10.103.131.19 <pending> 80:30355/TCP 2m23s
查看 Service 详情
kubectl describe service nginx-http
# 输出如下
Name: nginx-http
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"nginx-http","namespace":"default"},"spec":{"ports":[{"port":80,"t...
Selector: app=nginx
Type: LoadBalancer
IP: 10.103.131.19
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30355/TCP
Endpoints: 10.244.129.69:80,10.244.81.4:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
通过浏览器访问
通过浏览器访问 http://192.168.81.120:30355/ ,出现 Nginx 欢迎页即表示成功