Kubernetes 101 学习笔记
Kubernetes 101 - Kubectl CLI and Pods
Kubernetes and Docker
Kubernetes 101 内容涵盖 kubectl
, pods
, volumes
和多容器
的知识。
学习时注意区分各个概念与 Docker 概念的对应关系和差异。
大致的知识树如下:
- Kubernetes 101 - Kubectl CLI and Pods
- Kubectl CLI
- Pods
- Pod Definition
- Pod Management
- Volumes
- Volume Types
- Multiple Containers
Kubectl CLI
与 Kubernetes 交互最便捷的方式是实用 kubectl
命令行。
kubectl
的详细用法、命令和参数,可以查看:kubectl CLI reference
Pods
Pod 是 kubernetes 管理的基本单位。
在 Kubernetes 里,一个或多个容器的群组叫做 pod
。pod
中的容器同时部署,作为一组整体来启动、停止和复制。
Pod 详解
Pod Definition
最简单的 pod 定义
可以描述单个容器的部署。
例如,一台 nginx
服务器的 pod 定义
:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
Pod 定义
(pod defination
) 是对期望状态
(desired state
)的声明。
期望状态
是 Kubernetes 模型中很重要的概念。
Kubernetes 的职责是确保当前状态符合期望状态
。
例如,创建 Pod
时声明其中的容器处于 running
状态。
如果容器恰好没有运行(由于程序失败或其它原因),Kubernetes 为了达到期望状态,将持续(重新)创建它们。
除非 Pod
被删除,Kubernetes 不会停止。
Pod Management
创建刚才定义的包含 nginx 容器的 pod:
$ kubectl create -f docs/user-guide/walkthrough/pod-nginx.yaml
列出所有 pod:
$ kubectl get pods
如果 IP 能通,可以访问到 80 端口:
$ curl http://$(kubectl get pod nginx -o=template -t={{.status.podIP}})
大部分 provider 中,外部不能访问 pod 的 IP。 最简单的方式是创建一个 busybox pod,通过它远程运行命令。 参考:command execution documentation
删除指定名字的 pod:
$ kubectl delete pod nginx
Volumes
上面是一个简单的 web 服务器,容器中文件系统的生命周期和容器本身相同。 如果应用需要在迁移、重启和崩溃后仍然保存状态,就需要配置持久存储。
举个例子,创建一个 Redis pod,包含一个命名 volume
,和定义了这个 volume 目标路径的 volume 挂载
。
1) 定义 volume
volumes:
- name: redis-persistent-storage
emptyDir: {}
2) 在容器定义内部定义 volume 挂载
:
volumeMounts:
# name must match the volume name below
- name: redis-persistent-storage
# mount path within the container
mountPath: /data/redis
带持久存储的 Redis pod 完整配置示例:
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis
volumeMounts:
- name: redis-persistent-storage
mountPath: /data/redis
volumes:
- name: redis-persistent-storage
emptyDir: {}
volume 挂载
的名字指向一个空目录 volume。volume 挂载
的路径指向空目录 volume 挂载到容器内的路径。
Volume Types
- EmptyDir: 创建一个目录,容器失败和重启后仍然可用。
- HostPath: 挂载主机节点上已有的目录(如 /var/logs)。
Multiple Containers
然而,我们经常希望两个不同的容器共同工作。
举个例子,启动一个 web 服务器,和从 git 仓库拉取更新的辅助任务。
apiVersion: v1
kind: Pod
metadata:
name: www
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /srv/www
name: www-data
readOnly: true
- name: git-monitor
image: kubernetes/git-monitor
env:
- name: GIT_REPO
value: http://github.com/some/repo.git
volumeMounts:
- mountPath: /data
name: www-data
volumes:
- name: www-data
emptyDir: {}
这里使用了一个 volume。 此 volume 挂载到两个容器中。
在 web 服务器的容器中,volume 标记为 readOnly,因为不需要写入此目录。
还在 git-monitor 容器中引入了一个环境变量,可以给容器传参数,指定 git 仓库地址。