分开来讲下我遇到的几个点
Deployment
首先讲 Deployment 是个什么玩意儿, k8s 将一个节点称之为 node, 假设我们现在已经有一个 nginx 节点了,那如果我们需要两个 nginx 节点呢? 那我们就可以用到 Deployment, 我把它当成一个可以依据一定模板控制节点伸缩的管理器之类的东西。
贴下 nginx-deployment 的配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
- name: web-root
mountPath: /usr/share/nginx/html
volumes:
- name: nginx-config
configMap:
name: nginx-config
- name: web-root
hostPath:
path: /Users/fstre/Documents/project
简单说下参数说明:
apiVersion 这个是表示当前的使用 api 版本, k8s 到目前为止会有不同的 api 版本 release, 所以你需要指定当前使用的什么版本 比如说 Deployment 这个类型在 apiVersion:v1 是不支持的,所以你需要改到支持的版本才能用, 不然就会报错
metadata 该参数是必填参数,里面包含了 namespace、name 等 参数, namespace 默认为参数, name 为唯一字符串,用来标记该对象
spec.replicas: 1 表示只需要跑 1 个 nginx
tip: 如果是2 就是跑2个nginx
spec.selector.matchLabels 根据对应的{key:val}选择匹配的 k8s 对象
spec.container 描述容器名称和镜像 volumeMounts 表示容器内挂载的地址
spec.volumes 描述外部挂载 到容器的部分, 有多种类型、这里用到的 configMap 也是一个 k8s 对象,用来描述 nginx 配置、hostPath 用来描述本地挂载的路径
我们可以用 Deployment 做什么?
Deployment 可以用来管理类型相同的 pod,比如说上面说到的 nginx, 我们可以将 nginx-deployment 的 pod 统一进行升级、回退、缩放 、暂停等多个操作。
~ kubectl edit deployment/nginx-deployment //通过修改配置升级整个nginx-deployment
~ kubectl rollout history deployment/nginx-deployment // 查看操作历史
~ kubectl rollout undo deployment/nginx-deployment // 回退到上一版本
~ kubectl rollout undo deployment/nginx-deployment --to-revision=2 // 回退到指定版本
~ kubectl scale deployment nginx-deployment --replicas=1 // 缩放deployment的pod数量
~ kubectl rollout pause deployment/nginx-deployment // 暂停deployment
~ kubectl rollout resume deploy/nginx-deployment // 恢复deployment
值得注意的是通过 deployment 和 k8s,我们可以做到弹性伸缩,在用户量的情况下可以多增加些 pod, 而 k8s 内部会为我们做好负载均衡。
Service
从字面意思上来理解,就是节点之间的通讯及外部暴露服务。如果我们需要通过 nginx 访问 php 的话 , 我们就需要 php-fpm 来 解析 php 文件。那这里就涉及到节点之间的通讯了
apiVersion: v1
kind: Service
metadata:
name: php-service
spec:
selector:
app: php
ports:
- name: php
port: 9000
targetPort: 9000
参数说明:
- apiVersion、metadata 这些就不说了
- spec.selector 根据 label 选取对应的 pod
- spec.ports.port 指的是 services 向外暴露的节点
- spec.ports.targetPort 指的是 pod 向外暴露的节点
然后我们需要把 nginx config 改下
location ~ \.php$ {
fastcgi_pass php-service:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
把 fastcgi_pass 改为对应的 php-service, 不过这里有一个需要注意的坑点
nginx 和 php-fpm 必须挂载到同一文件夹下,不然 php-fpm 无法找到对应的 php 文件
然后我们需要将 nginx 的服务暴露出来, 服务分为几种类型
- ClusterIP // k8s 内部 ip, 仅限内部访问
- NodePort // 暴露 pod 的节点
- LoadBalancer // 为服务提供一个云平台的负载均衡器, 可以通过定义 metadata.annotations 来选择 具体见文档
- ExternalName // 会将服务映射到定义的 externName 上 这个不明白的可以参考点这里
本地服务的话, 我们可以通过两种来 NodePort 和 LoadBalancer 来暴露服务
- NodePort 暴露服务
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
NodePort: 80
- LoadBalancer 暴露服务
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
然后通过访问对应的端口号,我们就能访问到我们的 nginx 应用,需要注意的是 NodePort 默认端口的范围是(30000-32767), 不过我们可以通过kube-apiserver --service-node-port-range portRange
来指定对应的 portRange,前提是你安装了 kube-apiserver。
放个 php+nginx 的配置作为参考k8s nginx+php
nginx + php-fpm 配置的时候一定要注意将 nginx 和 php-fpm 都要挂载到同一目录下,不然 php-fpm 找不到对应的 php 文件