k8s之资源类型.md 11 KB

POD

Pod是一个或一个以上的 容器(例如Docker容器)组成的,是最小的可被调度的原子单位。
POD定义详解
apiVersion: v1
kind: Pod
metadata:
  name: string
  namaspace: string
  labels:
  - name: string
  annotations:
  - name: string
spec:
  containers:
  - name: string
    images: string
    imagePullPolice: [Always | Never | IfNotPresent]
    command: [string]
    args: [string]
    workingDir: string
    volumeMounts:
    - name: string
      mountPath: string
      readOnly: boolean
    ports:
    - name: string
      containerPort: int
      hostPort: int
      protocol: string
    env:
    - name: string
      value: string
    resources:
      limits:
        cpu: string
        memory: string
      requests:
        cpu: string
        memory: string
    livenessProbe:
      exec:
        command: [string]
      httpGet:
        path: string
        port: int
        host: string
        scheme: string
        httpHeaders:
        - name: string
          value: string
      tcpSocket:
        port: int
      initialDelaySeconds: number
      timeoutSeconds: number
      periodSeconds: number
      successThreshold: 0
      failureThreshold: 0
    securityContext:
      privileged: false
  restartPolicy: [Always | Never | OnFailure]   
  nodeSelector: object
  imagePullSecrets:
  - name: string
  hostNetwork: false
  volumes:
  - name: string
    emptyDir: {}
    hostPath:
      path: string
    secret:
      secretName: string
      items:
      - key: string
        path: string
    configMap:
      name: string
      items:
      - key: string
        path: string
静态POD
静态POD总是kubelet创建,无法做健康检查,不能通过apiserver进行管理.创建的静态pod有两种访问方式: 配置文件和http
Pod调度
1. Deployment/RC:全自动调度
2. NodeSelector: 定向调度
3. NodeAffinity: Node亲和度调度
4. PodAffinity: Pod亲和与互斥调度策略
5. Taints和 Tolerations(污点和容忍)
6. DaemonSet: 每个Node上调度一个Pod
7. Job: 批处理调度
8. CronJob: 定时任务
Pod的缩容和扩容
1. 手动扩容和缩容模式  如:
$ kubectl scale deployment nginx-deployment --replicas 5

2. 自动扩容和缩容模式,通过HPA的控制器,用于实现基于CPU使用率进行自动POD扩容和缩容的功能
如: 创建一个HPA控制器,在1和10之间调整POD的副本数量,以使平均Pod Cpu使用率维持在50%
$ kubectl autoscale deployment nginx-deployment --min=1 --max=10 --cpu-percent=50 

ConfigMap

将应用的配置信息与程序进行分离,这样可以使得应用程序被更好的复用,通过不同的配置也能实现更灵活的功能。
ConfigMap供容器使用的典型用法
1. 生成为容器内的环境变量
2. 设置容器启动命令的启动参数
3. 以Volume的形式挂载为容器内部的文件或目录
在POD种使用ConfigMap
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: proxy-nginx
data:
  default.conf: |-
    upstream scheduler {
        server 29.mlamp.cn:80;
    }
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
        location ~ /api {
          proxy_set_header    X-Real-IP           $remote_addr;
          proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
          proxy_set_header    Host                $http_host;
          proxy_set_header    X-NginX-Proxy       true;
          proxy_set_header    Connection          "";
          proxy_http_version  1.1;
          proxy_connect_timeout 1;
          proxy_send_timeout 30;
          proxy_read_timeout 60;
          proxy_pass   http://scheduler;
        }
        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

    }

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: proxy-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: proxy-nginx
  template:
    metadata:
      labels:
        app: proxy-nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          protocol: TCP
        volumeMounts:
        - name: nginx-conf
          mountPath: /etc/nginx/conf.d
        - name: nginx-html
          mountPath: /usr/share/nginx/html/
  volumes:
      - name: nginx-conf
        configMap:
          name: proxy-nginx
      - name: nginx-html
        persistentVolumeClaim:
          claimName: pvc002
      nodeSelector:
        node-role.kubernetes.io/master: ""
      tolerations:
      - key: "node-role.kubernetes.io/master"
        effect: "NoSchedule"
---
apiVersion: v1
kind: Service
metadata:
  name: proxy-nginx
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 32767
  selector:
    app: proxy-nginx
使用ConfigMap的限制条件
1. ConfigMap必须在Pod之前创建
2. ConfigMap受Namespace限制。只有处于相同Namespaces中的Pod可以使用。
3. 静态Pod无法使用
4. Pod对ConfigMap进行挂载操作时,容器内部中年挂载为目录,无法挂载为文件。

Service

 service是一个服务的抽象,通过label关联到后端的pod容器。通过创建service,将一组具有相同功能的容器应用提供统一的入口地址。
service基本用法
#假定有一个 Pod,对外暴露了 27017 端口,同时还被打上 statefulset.kubernetes.io/pod-name=mongo-0 标签
kind: Service
apiVersion: v1
metadata:
  name: mongo-0
spec:
  type: NodePort
  ports:
  - port: 27017
    targetPort: 27017
    protocol: TCP
    nodePort: 32624
  selector:
    statefulset.kubernetes.io/pod-name: mongo-0
Headless Service
有时不需要或不想要负载均衡,以及单独的 Service IP。遇到这种情况,可以通过指定 Cluster IP(spec.clusterIP)的值为 "None" 来创建 Headless Service

为什么使用Headless Service:
https://www.jianshu.com/p/a6d8b28c88a2

Headless Service 示例见 Mongo集群.md
集群外部访问Pod或service
 1.将容器应用端口号映射到物理机
 2.将service的端口号映射到物理机

Secret

Secret 是一种包含少量敏感信息例如密码、token 或 key 的对象.
目的是避免这样的信息被放在 Pod spec中或者镜像中;而将其放在一个 secret 对象中可以更好地控制它的用途,并降低意外暴露的风险

 #使用secret
 https://kubernetes.io/zh/docs/concepts/configuration/secret/#%E4%BD%BF%E7%94%A8-secret

Role

Role表示是一组规则权限,只能累加。
Role可以定义在一个namespace中,只能用于授予对单个命名空间中的资源访问的权限比如我们新建一个对默认命名空间中    
如:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: cephfs-provisioner
  namespace: cephfs
rules:
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["create", "get", "delete"]
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]

ClusterRole

ClusterRole与具有Role相同的权限角色控制能力.不同的是ClusterRole是集群级别的。可以:
1.集群级别的资源控制(例如节点访问权限)
2.非资源型endpoints(例如/ healthz访问)
3.所有命名空间资源控制(例如pods)
如:
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: cephfs-provisioner
  namespace: cephfs
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
  - apiGroups: [""]
    resources: ["services"]
    resourceNames: ["kube-dns","coredns"]
    verbs: ["list", "get"]
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get", "create", "delete"]
  - apiGroups: ["policy"]
    resourceNames: ["cephfs-provisioner"]
    resources: ["podsecuritypolicies"]
    verbs: ["use"]

RoleBinding和ClusterRoleBinding

RoloBinding可以将角色中定义的权限授予用户或用户组,RoleBinding包含一组权限列表(subjects),权限列表中包含有不同形式的待授予权限资源类型(用户,群组,服务帐户),
RoleBinding适用于某个命名空间内授权,而ClusterRoleBinding适用于集群范围内的授权。

如:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: cephfs-provisioner
  namespace: cephfs
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: cephfs-provisioner
subjects:
- kind: ServiceAccount
  name: cephfs-provisioner

---

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: cephfs-provisioner
subjects:
  - kind: ServiceAccount
    name: cephfs-provisioner
    namespace: cephfs
roleRef:
  kind: ClusterRole
  name: cephfs-provisioner
  apiGroup: rbac.authorization.k8s.io

Deployment

Deployment为Pod和Replica Set提供声明式更新

详细介绍 
http://docs.kubernetes.org.cn/317.html

StatefulSet

StatefulSets 旨在与有状态的应用及分布式系统一起使用.在具有以下特点时使用StatefulSets:                        
1.稳定性,唯一的网络标识符。
2.稳定性,持久化存储。
3.有序的部署和扩展。
4.有序的删除和终止。
5.有序的自动滚动更新。
Kubernetes的三种IP
# Node IP
    Node IP 是k8s节点的物理网卡ip

# Pod IP
    Pod IP 是Docker Engine根据docker0网桥的ip地址段分配的ip

# Cluster IP  service的ip地址
    Service的cluster IP属于k8s内部的地址,外部无法直接访问。cluster ip只能结合service port使用。