27.3 快速体验
目前,Kubenetes支持在多种环境下的安装,包括本地主机(Fedora)、云服务(Google GAE、AWS等),但最快速体验Kubernetes的方式显然是在本地通过Docker容器的方式来快速启动相关进程。
图27-2来自Kubernetes官方,展示了在单节点上使用Docker快速部署一套Kubernetes的拓扑。

图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可选版本信息:
- $ curl -k -s -X GET https://gcr.io/v2/google_containers/hyperkube-amd64/tags/
- list | jq -r '.tags[]'
- v1.2.0
- v1.2.0
- v1.2.0-alpha.6
- v1.2.0-alpha.7
- v1.2.0-alpha.8
- v1.2.0-beta.0
- v1.2.0-beta.1
- v1.2.1-beta.0
- v1.3.0-alpha.0
这里选用较新的稳定版本v1.2.0。
本地启动etcd服务,监听到默认的4001端口。读者可自行查阅前面的第22章。也可以使用容器方式快速启动etcd服务:
- $ docker run -d -p 4001:4001 gcr.io/google_containers/etcd
最后,可以通过如下命令来一次性部署并启动Kubernete需要的所有服务:
- $ docker run \
- --volume=/:/rootfs:ro \
- --volume=/sys:/sys:ro \
- --volume=/var/lib/docker/:/var/lib/docker:rw \
- --volume=/var/lib/kubelet/:/var/lib/kubelet:rw \
- --volume=/var/run:/var/run:rw \
- --net=host \
- --pid=host \
- --privileged=true \
- -d \
- gcr.io/google_containers/hyperkube-amd64:v1.2.0 \
- /hyperkube kubelet \
- --containerized \
- --hostname-override="127.0.0.1" \
- --address="0.0.0.0" \
- --api-servers=http://localhost:8080 \
- --config=/etc/kubernetes/manifests \
- --cluster-dns=10.0.0.10 \
- --cluster-domain=cluster.local \
- --allow-privileged=true --v=2
执行后查看本地实际启动容器,包括5个容器:1个kubelet容器和1个主服务Pod(包括apiserver、scheduler、controller-manager和pause):
- $ docker ps
- CONTAINER ID IMAGE
- COMMAND CREATED STATUS PORTS
- NAMES
- 7960d23a6020 gcr.io/google_containers/hyperkube:v1.2.0
- "/hyperkube scheduler" 2 minutes ago Up 2 minutes
- k8s_scheduler.eafafaf4_k8s-master-127.0.0.1_default_ba6eae9669ef0a03a0aa48
- b2f9df36a2_0c4d9e51
- 5d59975ec667 gcr.io/google_containers/hyperkube:v1.2.0
- "/hyperkube apiserver" 2 minutes ago Up 2 minutes
- k8s_apiserver.ffc11af8_k8s-master-127.0.0.1_default_ba6eae9669ef0a03a0aa48
- b2f9df36a2_8087ddee
- 95644df5cc66 gcr.io/google_containers/hyperkube:v1.2.0
- "/hyperkube controlle" 2 minutes ago Up 2 minutes
- k8s_controller-manager.672e021d_k8s-master-127.0.0.1_default_ba6eae9669ef0
- a03a0aa48b2f9df36a2_b767d196
- ce8ac7c6f23a gcr.io/google_containers/pause:0.8.0
- "/pause" 2 minutes ago Up 2 minutes
- k8s_POD.6d00e006_k8s-master-127.0.0.1_default_ba6eae9669ef0a03a0aa48b2f9df
- 36a2_affaf05b
- a063f246cd42 gcr.io/google_containers/hyperkube-amd64:v1.2.0
- "/hyperkube kubelet -" 2 minutes ago Up 2 minutes
- gigantic_kalam
实际上,Pod中的各个容器是在hyperkube-amd64:v1.2.0镜像中的/etc/kubernetes/manifests/master文件指定的,内容如下。注意不同版本镜像的文件内容可能略有不同:
- {
- "apiVersion": "v1",
- "kind": "Pod",
- "metadata": {"name":"k8s-master"},
- "spec":{
- "hostNetwork": true,
- "containers":[
- {
- "name": "controller-manager",
- "image": "gcr.io/google_containers/hyperkube:v1.2.0",
- "command": [
- "/hyperkube",
- "controller-manager",
- "--master=127.0.0.1:8080",
- "--v=2"
- ]
- },
- {
- "name": "apiserver",
- "image": "gcr.io/google_containers/hyperkube:v1.2.0",
- "command": [
- "/hyperkube",
- "apiserver",
- "--service-cluster-ip-range=10.0.0.1/24",
- "--address=127.0.0.1",
- "--etcd-servers=http://127.0.0.1:4001",
- "--cluster-name=kubernetes",
- "--v=2"
- ]
- },
- {
- "name": "scheduler",
- "image": "gcr.io/google_containers/hyperkube:v1.2.0",
- "command": [
- "/hyperkube",
- "scheduler",
- "--master=127.0.0.1:8080",
- "--v=2"
- ]
- }
- ]
- }
- }
3.测试状态
此时,在主机访问本地访问8080端口,将获取到支持的部分API列表:
- $ curl localhost:8080
- {
- "paths": [
- "/api",
- "/api/v1",
- "/apis",
- "/apis/extensions",
- "/apis/extensions/v1beta1",
- "/healthz",
- "/healthz/ping",
- "/logs/",
- "/metrics",
- "/resetMetrics",
- "/swagger-ui/",
- "/swaggerapi/",
- "/ui/",
- "/version"
- ]
- }
例如,可以查看版本信息:
- $ curl localhost:8080/version
- {
- "major": "1",
- "minor": "1",
- "gitVersion": "v1.2.0",
- "gitCommit": "5cb86ee022267586db386f62781338b0483733b3",
- "gitTreeState": "clean"
- }
通过/api/v1可以获取支持的API资源列表,例如:
- $ curl localhost:8080/api/v1
- {
- "kind": "APIResourceList",
- "groupVersion": "v1",
- "resources": [
- {
- "name": "bindings",
- "namespaced": true
- },
- {
- "name": "componentstatuses",
- "namespaced": true
- },
- {
- "name": "endpoints",
- "namespaced": true
- },
- ...
- {
- "name": "secrets",
- "namespaced": true
- },
- {
- "name": "serviceaccounts",
- "namespaced": true
- },
- {
- "name": "services",
- "namespaced": true
- }
- ]
- }
用户还可以进一步通过这些API对相关资源进行CRUD操作。
当然,除了API方式之外,Kubernetes也提供了现成的客户端操作命令:kubectl,将在后面27.6节进行介绍。
