CentOS搭建k8s集群(10)—k8s如何部署pod

一、pod控制器
pod是k8s容器的最小单位,而控制它要用k8s的控制器,k8s有好几个控制器类型,常用的是以下两个:
DaemonSet方式:后台守护进程的方式,每个节点都部署一个pod副本,适合于资源监控、日志收集等功能
Deployment方式:最常用的方式,可以动态的扩展和缩小pod的数量

二、手写yaml文件方式
1、deployment yaml文件格式
例如手写一个abc.yaml
使用安装命令:kubectl apply -f abc.yaml
abc.yaml是部署文件,描述了创建资源的模板,需要手写。可以重复使用,像代码一样管理
里面定义了资源的名称、用哪个镜像、副本数量、部署位置等信息

2、那么yaml的格式说明从哪里来
1)获取所有的资源
kubectl api-resources
2)获取deployment资源信息
kubectl explain deploy
3)获取deployment下的spec字段,格式就是:type.fieldName[.fieldName]
kubectl explain deploy.spec

3、docker里要有镜像
k8s会把镜像放在pod里启动起来

三、helm方式
chart是一个程序包,是helm的打包格式

1、创建chart包
cd /tmp
helm create myapp

2、查看结构

tree myapp
myapp ├── charts ├── Chart.yaml ├── templates │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── hpa.yaml │ ├── ingress.yaml │ ├── NOTES.txt │ ├── serviceaccount.yaml │ ├── service.yaml │ └── tests │ └── test-connection.yaml └── values.yaml

3、说明
1)Chart.yaml:描述chart的概要信息
2)values.yaml:chart的默认配置值,相当于写程序定义的常量参数
3)templates目录:该目录下是k8s资源的配置模板,定义了各种资源,比如这里就定义了:deployment、ingress、serviceaccount、service。安装时会自动关联values.yaml中配置的参数
4)helm采用了go语言的模板
比如values.yaml中有
serviceAccount:
# Specifies whether a service account should be created
create: true

在serviceaccount.yaml中,使用如下语法引用参数
{{- if .Values.serviceAccount.create -}}
5)templates/NOTES.txt:生成的简单的应用使用说明文档
6)templates/_helpers.tpl:如果存在一些信息多个模板都会用到,则可在这个文件中将其定义为子模板,然后通过templates函数引用

四、使用两种方式安装pod
1、手写yaml方式
使用Deployment控制器创建pod
1)拉取镜像
docker pull busybox
2)创建busybox.yaml
vi busybox.yaml
填入:

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: my-busybox
spec: 
  replicas: 1
  selector: 
    matchLabels:
      app: my-busybox
  template: 
    metadata: 
      labels: 
        app: my-busybox
    spec: 
      containers: 
      - name: busybox
        image: busybox:latest
        args: 
        - /bin/sh
        - -c
        - sleep 10s; touch /tmp/iambusybox; sleep 1m

注意1:selector标签是必须要的,并且选定的selector.matchLabels.app的名字要和template.metadata.labels.app一样
否则会提示报错:
error: error validating "busybox.yaml": error validating data: ValidationError(Deployment.spec): missing required field "selector" in io.k8s.api.apps.v1.DeploymentSpec; if you choose to ignore these errors, turn validation off with --validate=false
注意2:args参数是为了容器启动后不立即退出,因为busybox没有执行命令的话,启动后会立即退出
3)安装pod
kubectl apply -f busybox.yaml
deployment.apps/my-busybox created
4)查看pod
kubectl get pod --all-namespaces -o wide
找到我们的这个pod,被部署到了node1
由于busybox的命令执行完大约1分10秒就自动退出,k8s检测到容器退出后会自动重启这个pod,可以看到RESTARTS是3次
NAMESPACE       NAME                                     READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
default         my-busybox-58db4446cd-bnzz6              1/1     Running   3          5m50s 10.122.1.4       k8s-node1    <none>           <none>
...
5)查看pod详情
kubectl describe pod my-busybox-58db4446cd-bnzz6

2、pod状态说明
Pending:还没有被部署
Terminating:容器连不上,但不会删除
CrashLoopBackOff:启动后又异常退出
Running:正常运行

3、使用helm打包安装方式
回到前面创建的myapp的chart
1)检查文件语法
helm方式比手写方式的一个优势是可以对文件做语法校验,方便了我们开发
语法校验:
helm lint myapp
模拟安装:
helm install myapp --name-template myapp-test --dry-run --debug
2)修改values.yaml

ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.org/rewrites: "serviceName=myapp-test rewrite=/"
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: nginx.chart-example.local
      paths: 
        - /test/
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local
3)安装
helm install myapp --name-template myapp-test
显示安装成功
NAME: myapp-test
LAST DEPLOYED: Fri Nov 13 10:11:29 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
  http://nginx.chart-example.local/test/

4、配置好hosts后,浏览器访问
http://nginx.chart-example.local/test/
显示:Welcome to nginx!

5、说明
1)nginx.org/rewrites: "serviceName=myapp-test rewrite=/"
表示url重定向,例如:
/test/ 重定向到 /下
/test/abc 重定向到 /abc下
2)--name-template指定了release的名称

参考资料:
https://www.cnblogs.com/it-peng/p/11393770.html
https://blog.csdn.net/cds992/article/details/106135270/
https://blog.csdn.net/u014036123/article/details/80758185
https://docs.nginx.com/nginx-ingress-controller/configuration/ingress-resources/advanced-configuration-with-annotations/