关于 Kubernetes 101,我们将涵盖 kubectl, Pods, Volumes 和多个容器这些内容。
kubectl
是什么。您必须拥有一个 Kubernetes 集群,并且必须使用 kubectl 命令行工具与你的集群进行通信。如果您还没有一个集群,您可以通过 Minikube 创建一个集群,或者使用这些 Kubernetes playground :
To check the version, enter kubectl version
.
与 Kubernetes 进行交互最简单的方法就是通过 kubectl 命令行。
想要了解更多关于 kubectl,包括它的使用、命令和参数,查看 kubectl 概览。
想要了解更多关于 kubectl 的安装和配置,查看 安装和设置 kubectl。
在 Kubernetes 中,一组一个或者多个容器被称为 Pod 。在一个 Pod 里的容器是在一起部署的,它们作为一组一起启动、停止和伸缩。
想要了解更多, 查看 Pods。
最简单的 Pod 定义描述了 Deployment 中的单个容器。例如,一个 nginx web 服务器 Pod 可能被定义为:
pods/simple-pod.yaml
|
---|
|
Pod 是对预期状态的声明的定义。预期状态在 Kubernetes 模型中是一个非常重要的概念。在这个系统中的很多东西都呈现为预期的状态,Kubernetes 保证现在的状态和预期的状态保持一致。例如,当您创建了一个 Pod 并且声明了将要在里面运行的容器。如果这些容器因为程序故障没有运行,Kubernetes 将继续创建或者重新创建这个 Pod 以使这个 Pod 达到期望状态。这个过程会一直持续直到您删除这个 Pod。
想了解更多信息,请查看 Kubernetes Design Documents and Proposals。
创建一个包含 nginx 服务器的 Pod (simple-pod.yaml):
kubectl create -f https://k8s.io/examples/pods/simple-pod.yaml
列出所有的 Pod:
kubectl get pods
对于大多数服务提供商,Pod IP 无法从外部访问。测试 Pod 是否工作的最简单方法是创建一个 busybox Pod 并且远程执行 exec 命令。有关更多信息,请参阅 获取正在运行的容器的Shell.
如果可以访问 Pod 的 IP,则可以使用端口 80 上的 wget 访问其 http 端点:
kubectl run busybox --image=busybox --restart=Never --tty -i --generator=run-pod/v1 --env "POD_IP=$(kubectl get pod nginx -o go-template='{{.status.podIP}}')"
u@busybox$ wget -qO- http://$POD_IP # Run in the busybox container
u@busybox$ exit # Exit the busybox container
kubectl delete pod busybox # Clean up the pod we created with "kubectl run"
删除一个名为 nginx 的 Pod:
kubectl delete pod nginx
这对于简单的静态 Web 服务器来说非常棒,但是持久存储呢?
容器文件系统只在容器中存在。因此,如果您的应用程序的状态需要在重定位,重新启动和崩溃中存活,您将需要配置一些持久存储。
在此示例中,您将创建一个具有数据卷的 Redis Pod,并将数据卷挂载到指定的路径。
定义一个卷:
volumes:
- name: redis-storage
emptyDir: {}
在容器定义中定义卷挂载:
volumeMounts:
# name must match the volume name defined in volumes
- name: redis-storage
# mount path within the container
mountPath: /data/redis
以下是具有持久存储卷的 Redis Pod 定义的示例 (redis.yaml):
pods/storage/redis.yaml
|
---|
|
其中:
volumeMounts
name
是特定 volumes
name
的引用。volumeMounts
mountPath
是在容器中挂载卷的路径。/var/logs
).有关更多信息,请参阅 卷.
Note: 注意: 以下示例在语法上是正确的,但某些镜像(例如 kubernetes/git-monitor)尚不存在。我们正在努力将这些变成可以工作的示例。
但是,通常您希望有两个不同的容器一起工作。这方面的一个例子是 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: {}
请注意,我们在此处还添加了一个卷。在这种情况下,卷安装在两个容器中。它在 Web 服务器容器的情况下标记为 readOnly
,因为它不需要写入目录。
最后,我们还向 git-monitor
容器引入了一个环境变量,它允许我们使用我们想要跟踪的特定 git 仓库来参数化该容器。
继续阅读 Kubernetes 201 或者有关完整的应用程序,请参阅 guestbook 示例
此页是否对您有帮助?
Thanks for the feedback. If you have a specific, answerable question about how to use Kubernetes, ask it on Stack Overflow. Open an issue in the GitHub repo if you want to report a problem or suggest an improvement.