Pod
Pod是一组紧密关联的容器集合,它们共享IPC、Network、UTC namespace,是k8s调度的基本单位。
Pod的设计理念是支持多个容器在一个Pod中共享网络和文件系统,可以通过进程间通信和文件共享提供服务。
Pod一旦调度后就跟Node绑定,即使Node挂掉,也不会重新调度,推荐使用Deployments、Daemonsets等控制器。
当Pod删除的时候,首先会给内部的进程发送SIGTERM,等待一段时间(grace period)后才强制停止依然运行的进程。
特权容器(通过SecurityContext配置)具有改变系统配置的权限。
定义Pod
在k8s中,所有对象都使用manifest(yaml或json)定义。下面定义简单的nginx服务
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
使用Volume
Volume可以为容器提供持久化的存储
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis
volumeMounts:
- name: redis-storage
mountPath: /data/redis
volumes:
- name: redis-storage
emptyDir: {}
使用私有镜像
在使用私有镜像时,需要创建一个docker registry secret,并在容器中引用
kubectl create secret docker-registry regsecret \
--docker-server=<your-registry-server> \
--docker-username=<your-name> \
--docker-password=<your-password> \
--docker-email=<your-email>
在容器中引用secret
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image: <your-private-image>
imagePullSecrets:
- name: regsecret
RestartPolicy
支持3种RestartPolicy
Always:只要退出就重启
OnFailure:失败退出时重启
Never:只要退出就不重启
这里的重启是指在Pod所在的Node上面本地重启,并不会调度到其他Node上。
环境变量
环境变量为容器提供了一些重要的资源,包括容器和Pod的基本信息以及集群中服务的信息等。
HOSTNAME
环境变量保存pod的hostname。
Pod的名字、命名空间、IP以及容器的计算资源限制等可以以Downward API的方式获取并存储到环境变量中。
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- name: test-container
image: gcr.io/google_containers/busybox
command: ["sh","-c"]
args:
- env
resources:
memory: "32Mi"
cpu: "125m"
limits:
memory: "64Mi"
cpu: "250m"
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef: metadata.name
fieldPath: spec.nodeName
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: MY_POD_SERVICE_ACCOUNT
valueFrom:
fieldRef:
fieldPath: spec.serviceAccountName
- name: MY_CPU_REQUEST
valueFrom:
resourceFieldRef:
containerName: test-container
resource: requests.cpu
- name: MY_CPU_LIMIT
valueFrom:
resourceFieldRef:
containerName: test-container
resource: limits.cpu
- name: MY_MEM_REQUEST
valueFrom:
resourceFieldRef:
containerName: test-container
resource: requests.memory
- name: MY_MEM_LIMIT
valueFrom:
resourceFieldRef:
containerName: test-container
resource: limits.memory
restartPolicy: Never
集群中服务的信息
容器的环境变量中包括了容器运行前创建的所有服务的信息,比如默认的kubernetes服务对应的环境变量。
KUBERNETES_PORT_443_TCP_ADDR=10.0.0.1
KUBERNETES_SERVICE_HOST=10.0.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.0.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.0.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
由于环境变量存在创建顺序的局限性,环境变量中不包含后来创建的服务,推荐使用DNS解析服务。