k8s 一小时入门实操(一)

2023-03-02  本文已影响0人  mafa1993

pod的网络

  1. 每个容器的虚拟ip不能一样,可以将每个docker的网络设置成不一样来实现
  2. 同主机的pod通过docker0网桥互相访问
  3. 不同主机的pod,通过flannel网络进行转发,类似于vxlan,docker网桥数据发送到flannel的网桥,经过flanneld的处理,发送到目标主机,目标主机再去解包,发现需要转给的pod
  4. pod访问service,通过iptabels或者ipvs访问

k8s安装

  1. 配置成使用ipvs
apiVersion: kubeproxy.config.k8s.io/v1beta1
kind: KubeProxyConfiguration
featureGates: 
  SupportIPVSProxyMode: true
mode: ipvs
  1. 修改deployment的replicaset数 kubectl scale --replicas=3 deployment/nginx-deployment
  2. 查看ipvs ipvsadm -Ln

yaml文件

  1. 可以使用双叹号标识强制类型转换!!str true
  2. 字符串双引号内的特殊字符不会被转义
  3. 单引号内还有单引号,使用双单引号进行转义
  4. 多行文本,换行时需要有缩进,也可以用|保留换行符,使用>折叠换行,|- 代表删除末尾换行符,|+ 保留结尾换行符
str: 这是一段
  多行
  字符串

this: |
Foo
Bar

that: >
Foo
Bar

yaml常用字段说明

  1. kubectl apiversion 查看version
  2. kind stirng 标识指定的资源类型和角色
  3. metadata
  4. metadata.name string 定义名字
  5. metadata.namespace string 所属命名空间
  6. spec object 对象详细信息
  7. spec.containers[]
  8. spec.containers[].name string 定义容器名
  9. spec.containers[].image string 定义容器使用的镜像
  10. spec.containers[].imagePullPolicy string always never ifnotpresent 镜像的拉去策略
  11. spec.containers[].command[] list 指定容器启动命令
  12. spec.containers[].args[]
  13. spec.containers[].workingDir string 指定容器的工作目录
  14. spec.restartPolicy string 重启策略
  15. spec.nodeSelector object 以key-value方式存储 label
  16. spec.imagePullSecrets object 定义pull镜像是使用的secret
  17. spec.hostNetwork bool 是否使用主机网络,默认false

使用kubectl explain pod 可以查看pod的yaml应该配置的字段,kubectl explain pod.apiVersion 这样可以看pod的apiVersion的定义

查看某个容器的日志 kubectl log my-pod -c test , 使用-c 指定要查看日志的容器

容器生命周期

  1. initC,初始化容器,可以有多个initc进程,但是不能并行执行
  2. start,容器启动
  3. readness, 容器是否就绪的检查
  4. liveness 容器存活检查
  5. stop,容器退出时需要执行的操作

使用initc检测依赖的容器

如果pod中两个容器相互依赖,可以使用initc来检测依赖容器是否启动了

spec: 
  containers:
  - name: myapp-container
    image: busybox
    command: ["sh","-c","echo 1 && sleep 3600"]
  initContainers:
  - name: init-myservice
    image: busybox
    command: ["sh","-c","until nslookup service; do echo waiting for service; sleep 2;"]
  - name: init-mydb
    image: busybox
    command: ["sh","-c","until nslookup mydb; do echo waiting for db; sleep 2;"]

如果使用latest版本,每次都会重新拉取镜像

  1. 在pod启动过程中,init容器会按顺序在网络和数据卷初始化后启动,每个容器必须在下一个容器启动之前成功退出
  2. 依赖容器检测,也可以使用readiness来做

探针

探针是kubelet对容器的检测

  1. 探针类型 livenessProbe。readinessProbe
  2. 探测方法 exec、tcpsocket、httpget
// 定义在pod yaml中
spec: 
  containers: 
  - name: readiness-httpget
    image: wangyanglinux/myapp:v1
    imagePullPolicy: IfNotPresent
    readinessProbe: 
      httpGet: 
        port: 80
        path: /index.html
      initialDelaySeconds: 1 # 延迟1s执行
      periodSeconds: 3 # 每3s检测一次
      timeoutSeconds: 3
spec: 
  containers: 
  - name: readiness-httpget
    image: wangyanglinux/myapp:v1
    imagePullPolicy: IfNotPresent
    livenessProbe: 
      exec: 
        command: ["test","-e","/tmp.live"]
      initialDelaySeconds: 1
      periodSeconds: 3
    

可以通过livenessProbe实现某个容器执行一段时间重新运行

启动、退出动作定义

spec: 
  containers:
  - name: lifecycle-demo-container
    image: nginx
    lifecycle:
      postStart: 
        exec: 
          command: ["/bin/sh","-c","echo hello from the post start handler > /var/log/msg"]
      preStop: 
        exec: 
          command: ["/usr/sbin/nginx","-s","quit"]  # 也可以为备份数据等

pod状态:pending、running、succeeded(所有容器都被成功终止,并不会再重启)、failed、unknown(无法获取状态,通常是和主机通信失败)

控制器

  1. replicaset
  2. deployment,它创建rs,然后rs创建pod,
    • 滚动升级和回滚
    • 扩缩容
    • 暂停继续Deployment
  3. daemonset
  4. statefulset,稳定的持久化,稳定的标识,有序部署,有序收缩(部署逆序)
  5. job, 运行出错退出会重新执行
  6. cronjob,在特定时间自己创建job来执行
  7. hpa
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata: 
  name: frontend
spec: 
  replicas: 3
  selector: 
    matchLabels: 
      tier: frontend  # 选择frontend标签的
  template:  # 相当于嵌套的一个pod的配置
    metadata:
      labels:
        tier: frontend
    spec: 
      containers:
      - name: php-redis
        image: xx
        env:
        - name: GET_HOSTS_FROM
          value: dns
        ports: 
        - containerPort: 80
  1. 标签修改 kubectl label pod frontend-xxx tier=frontend1
  2. kubectl get pod --show-labels
# deployment 创建
apiVersion: extensions/v1beta1
kind: Deployment
metadata: 
  name: nginx-deployment
spec: 
  replicas: 3
  # revisionHistoryLimit: x  指定deployment保留多少revision历史,默认保留全部,设置为0则不能回滚
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      containers:
      - name: nginx
        image: nginx:1.7.0
        ports:
        - containerPort: 80
  1. kubectl使用时,增加--record 可以记录下每次执行的命令,方便revision
  2. 创建deployment的时候会自动创建一个replicaSet
  3. 扩容 kubectl scale deployment nginx-deployment --replicas 10
  4. 镜像更新 kubectl set image xxx
    nginx=nginx:1.9.1 nginx为容器,等号后为镜像版本,更新镜像会生成新的rs
  5. 回滚 kubectl rollout undo deployment/nginx-deployment
  6. kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80 自动扩缩容
  7. 如果在pod创建过程中,修改image,会立即停止旧pod创建,然后去创建新pod
  8. 查看回滚状态 kubectl rollout status deployment/nginx-deployment, 可以通过这个命令的状态值来判断是否回滚完成 $?为0 则完成了
  9. 查看历史版本 kubectl rollout history deployment/nginx-deployment
  10. 指定回滚版本 undo 增加参数 --to-revision=x
  11. 暂停更新或者回滚 kubectl rollout pause deployment/nginx-deployment
# daemonset 会在每个node上创建pod
apiVersion: apps/v1
kind: DaemonSet
metadata: 
  name: deamonset-example
  labels: 
    app: daemonset
spec: 
  selector:
    matchLabels: 
      name: deamonset-example
  template:
    metadata: 
      labels: 
        name: deamonset-example
    spec: 
      containers:
      - name: daemonset-example
        image: xxx
# job
apiVersion: batch/v1
kind: Job
metadata: 
  name: pi
spec: 
  template: 
    metadata:
      name: pi
    spec: 
      containers:
      - name: pi
        image: perl
        command: ["perl","-Mbignum=bpi","-wle","print bpi(2000)"]
      restartPolicy: Never # 有never和onfailure两个
  # completions: 1 # 标志job结束时需要成功运行的pod个数,默认1
  # parallelism: 1 标志并行运行的pod个数,默认1
  # activeDeadlineSeconds: 10 # 标志失败pod的重试最多打时间,超过这个时间不会继续重启
# cronjob
apiVersion: batch/v1
kind: CronJob
metadata: 
  name: p
spec: 
  # startingDeadlineSeconds: 19 # 启动job 的时间,如果这个时间内,job还没执行完,则为失败
  # concurrencyPolicy: allow # 并发策略,有allow forbid禁止并发 replace取消当前正在运行的job,用新的替换
  # suspend: true 
  # successfulJobsHistoryLimit:  # 成功的历史,默认3
  # failedJobsHistoryLimit # 失败的历史,默认1
  schedule: "*/1 * * * *"  # 同crontab
  jobTemplate:
    spec: 
      template: 
        metadata:
        spec: 
          containers:
          - name: pi
            image: perl
            command: ["perl","-Mbignum=bpi","-wle","print bpi(2000)"]
            restartPolicy: Never # 有never和onfailure两个

cronjob没有成功失败的概念,只会定期的调度job,需要看job的成功失败

service

  1. 根据label匹配一组pod
  2. 四种模式

代理模式

  1. userspace,client访问service ip,通过service ip的iptables转发到kube proxy,然后通过kube proxy 到server端
  2. iptables代理模式,client到service ip,通过iptables转发,不再经过kube proxy,apiserver监控kube proxy 对iptables规则进行监控
  3. ipvs代理,将iptables替换成ipvs,需要提前安装ipvs,并且安装rr、lc、dh、sh、sed、nq等负载均衡算法
  4. 如果ipvs不可用,会自动转化为iptables
# cluster ip
apiVersion: v1
kind: Service
metadata: 
  name: myapp
  namespace: default
spec: 
  type: ClusterIP
  selector:
    app: myapp
    release: stabel
  ports: 
  - name: http
    port: 80
    targetPort: 80
  1. 无头服务,不建立虚拟ip,也不会进行负载均衡和路由,将ClusterIP设置为None即可,可以实现通过域名访问后端的pod
# headless 
apiVersion: v1
kind: Service
metadata: 
  name: myapp
spec: 
 selector:
   app: myapp
  clusterIP: "None"
  ports: 
  - port: 80
    targetPort: 80
  1. svc和pod为多对多关系
# nodePort  每个node上都会绑定一个对外的port,访问任何一个节点都可以  
apiVersion: v1
kind: Service
metadata: 
  name: myapp
  namespace: default
spec: 
  type: NodePort
  selector:
    app: myapp
    release: stabel
  ports: 
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30001 
  1. lb和nodeport类似,创建nodeport后,在云端创建lb进行导流,lb一般为收费服务
# externalName
kind: Service
apiVersion: v1
metadata: 
  name: my-service-1
  namespace: default
spec: 
  type: ExternalName
  externalName: www.baidu.com  # 外部地址,可以为ip

查询主机 my-service.default.svc.cluster.local的dns记录时,会指向到www.baidu.com,相当于增加了一条cname

ingress

  1. 需要ingress插件支持,如nginx-ingress,可以下载官方yaml,进行部署
  2. 会根据ingress的内容,自动生成nginx的配置
  3. docker save -o xxx.tar.gz xxximages 从docker 导出镜像,docker load -i xx 导入镜像
apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
  name: nginx-test
spec: 
  rules:
    - host: foo.bar.com
      http:
        paths: 
        - path: /
          backend: 
          serviceName: nginx-svc
          servicePort: 80 
  1. https 转http
apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
  name: nginx-test
  # annotations:  # auth basic 
  #   nginx.ingress.kubernetes.io/auth-type: basic
  #   nginx.ingress.kubernetes.io/auth-secret: basic-auth
  #   nginx.ingress.kubernetes.io/auth-realm: 'Authentication require - foo'
spec: 
  tls:
    - hosts: 
     - foo.bar.com
     secretName: tls-secret
     rules:
     - host: foo.bar.com
        http:
          paths: 
          - path: /
            backend: 
            serviceName: nginx-svc
            servicePort: 80 

创建https证书 kubectl create secret tls tls-secret --key tls.key --cert tls.crt

创建auth basic文件

htpasswd -c auth foo  
kubectl create secret generic basic-auth --from-file=auth

重定向 nginx.ingress.kubernetes.io/rewrite-target: http://xxxx

上一篇 下一篇

猜你喜欢

热点阅读