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使用。