27.3 快速体验

目前,Kubenetes支持在多种环境下的安装,包括本地主机(Fedora)、云服务(Google GAE、AWS等),但最快速体验Kubernetes的方式显然是在本地通过Docker容器的方式来快速启动相关进程。

图27-2来自Kubernetes官方,展示了在单节点上使用Docker快速部署一套Kubernetes的拓扑。

27.3 快速体验 - 图1

图27-2 在Docker中启动Kubernetes

1.依赖镜像

Kubernetes通过Docker容器方式部署依赖的镜像包括:

·gcr.io/google_containers/hyperkube:提供所有的Kubernetes组件支持;

·gcr.io/google_containers/etcd:提供Etcd数据库存储;

·gcr.io/google_containers/pause:一个轻量级的基础设施容器(不到1MB),用于为每个pod提前创建命名空间,其他什么也不做。

2.启动服务

首先,查看目前gcr.io/google_containers/hyperkube可选版本信息:


  1. $ curl -k -s -X GET https://gcr.io/v2/google_containers/hyperkube-amd64/tags/
  2. list | jq -r '.tags[]'
  3. v1.2.0
  4. v1.2.0
  5. v1.2.0-alpha.6
  6. v1.2.0-alpha.7
  7. v1.2.0-alpha.8
  8. v1.2.0-beta.0
  9. v1.2.0-beta.1
  10. v1.2.1-beta.0
  11. v1.3.0-alpha.0

这里选用较新的稳定版本v1.2.0。

本地启动etcd服务,监听到默认的4001端口。读者可自行查阅前面的第22章。也可以使用容器方式快速启动etcd服务:


  1. $ docker run -d -p 4001:4001 gcr.io/google_containers/etcd

最后,可以通过如下命令来一次性部署并启动Kubernete需要的所有服务:


  1. $ docker run \
  2. --volume=/:/rootfs:ro \
  3. --volume=/sys:/sys:ro \
  4. --volume=/var/lib/docker/:/var/lib/docker:rw \
  5. --volume=/var/lib/kubelet/:/var/lib/kubelet:rw \
  6. --volume=/var/run:/var/run:rw \
  7. --net=host \
  8. --pid=host \
  9. --privileged=true \
  10. -d \
  11. gcr.io/google_containers/hyperkube-amd64:v1.2.0 \
  12. /hyperkube kubelet \
  13. --containerized \
  14. --hostname-override="127.0.0.1" \
  15. --address="0.0.0.0" \
  16. --api-servers=http://localhost:8080 \
  17. --config=/etc/kubernetes/manifests \
  18. --cluster-dns=10.0.0.10 \
  19. --cluster-domain=cluster.local \
  20. --allow-privileged=true --v=2

执行后查看本地实际启动容器,包括5个容器:1个kubelet容器和1个主服务Pod(包括apiserver、scheduler、controller-manager和pause):


  1. $ docker ps
  2. CONTAINER ID IMAGE
  3. COMMAND CREATED STATUS PORTS
  4. NAMES
  5. 7960d23a6020 gcr.io/google_containers/hyperkube:v1.2.0
  6. "/hyperkube scheduler" 2 minutes ago Up 2 minutes
  7. k8s_scheduler.eafafaf4_k8s-master-127.0.0.1_default_ba6eae9669ef0a03a0aa48
  8. b2f9df36a2_0c4d9e51
  9. 5d59975ec667 gcr.io/google_containers/hyperkube:v1.2.0
  10. "/hyperkube apiserver" 2 minutes ago Up 2 minutes
  11. k8s_apiserver.ffc11af8_k8s-master-127.0.0.1_default_ba6eae9669ef0a03a0aa48
  12. b2f9df36a2_8087ddee
  13. 95644df5cc66 gcr.io/google_containers/hyperkube:v1.2.0
  14. "/hyperkube controlle" 2 minutes ago Up 2 minutes
  15. k8s_controller-manager.672e021d_k8s-master-127.0.0.1_default_ba6eae9669ef0
  16. a03a0aa48b2f9df36a2_b767d196
  17. ce8ac7c6f23a gcr.io/google_containers/pause:0.8.0
  18. "/pause" 2 minutes ago Up 2 minutes
  19. k8s_POD.6d00e006_k8s-master-127.0.0.1_default_ba6eae9669ef0a03a0aa48b2f9df
  20. 36a2_affaf05b
  21. a063f246cd42 gcr.io/google_containers/hyperkube-amd64:v1.2.0
  22. "/hyperkube kubelet -" 2 minutes ago Up 2 minutes
  23. gigantic_kalam

实际上,Pod中的各个容器是在hyperkube-amd64:v1.2.0镜像中的/etc/kubernetes/manifests/master文件指定的,内容如下。注意不同版本镜像的文件内容可能略有不同:


  1. {
  2. "apiVersion": "v1",
  3. "kind": "Pod",
  4. "metadata": {"name":"k8s-master"},
  5. "spec":{
  6. "hostNetwork": true,
  7. "containers":[
  8. {
  9. "name": "controller-manager",
  10. "image": "gcr.io/google_containers/hyperkube:v1.2.0",
  11. "command": [
  12. "/hyperkube",
  13. "controller-manager",
  14. "--master=127.0.0.1:8080",
  15. "--v=2"
  16. ]
  17. },
  18. {
  19. "name": "apiserver",
  20. "image": "gcr.io/google_containers/hyperkube:v1.2.0",
  21. "command": [
  22. "/hyperkube",
  23. "apiserver",
  24. "--service-cluster-ip-range=10.0.0.1/24",
  25. "--address=127.0.0.1",
  26. "--etcd-servers=http://127.0.0.1:4001",
  27. "--cluster-name=kubernetes",
  28. "--v=2"
  29. ]
  30. },
  31. {
  32. "name": "scheduler",
  33. "image": "gcr.io/google_containers/hyperkube:v1.2.0",
  34. "command": [
  35. "/hyperkube",
  36. "scheduler",
  37. "--master=127.0.0.1:8080",
  38. "--v=2"
  39. ]
  40. }
  41. ]
  42. }
  43. }

3.测试状态

此时,在主机访问本地访问8080端口,将获取到支持的部分API列表:


  1. $ curl localhost:8080
  2. {
  3. "paths": [
  4. "/api",
  5. "/api/v1",
  6. "/apis",
  7. "/apis/extensions",
  8. "/apis/extensions/v1beta1",
  9. "/healthz",
  10. "/healthz/ping",
  11. "/logs/",
  12. "/metrics",
  13. "/resetMetrics",
  14. "/swagger-ui/",
  15. "/swaggerapi/",
  16. "/ui/",
  17. "/version"
  18. ]
  19. }

例如,可以查看版本信息:


  1. $ curl localhost:8080/version
  2. {
  3. "major": "1",
  4. "minor": "1",
  5. "gitVersion": "v1.2.0",
  6. "gitCommit": "5cb86ee022267586db386f62781338b0483733b3",
  7. "gitTreeState": "clean"
  8. }

通过/api/v1可以获取支持的API资源列表,例如:


  1. $ curl localhost:8080/api/v1
  2. {
  3. "kind": "APIResourceList",
  4. "groupVersion": "v1",
  5. "resources": [
  6. {
  7. "name": "bindings",
  8. "namespaced": true
  9. },
  10. {
  11. "name": "componentstatuses",
  12. "namespaced": true
  13. },
  14. {
  15. "name": "endpoints",
  16. "namespaced": true
  17. },
  18. ...
  19. {
  20. "name": "secrets",
  21. "namespaced": true
  22. },
  23. {
  24. "name": "serviceaccounts",
  25. "namespaced": true
  26. },
  27. {
  28. "name": "services",
  29. "namespaced": true
  30. }
  31. ]
  32. }

用户还可以进一步通过这些API对相关资源进行CRUD操作。

当然,除了API方式之外,Kubernetes也提供了现成的客户端操作命令:kubectl,将在后面27.6节进行介绍。