K8S初探——基本概念+服务启动
核心概念
-
Pod:Pod是在K8s集群中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。(Pod是一组容器的组合,这些容器一起合作对外提供一个服务)
-
复制控制器(Replication Controller,RC)
RC是K8s集群中最早的保证Pod高可用的API对象。通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。指定的数目可以是多个也可以是1个;少于指定数目,RC就会启动运行新的Pod副本;多于指定数目,RC就会杀死多余的Pod副本。即使在指定数目为1的情况下,通过RC运行Pod也比直接运行Pod更明智,因为RC也可以发挥它高可用的能力,保证永远有1个Pod在运行。RC是K8s较早期的技术概念,只适用于长期伺服型的业务类型,比如控制小机器人提供高可用的Web服务。(类似于分布式系统中的副本) -
副本集(Replica Set,RS)
RS是新一代RC,提供同样的高可用能力,区别主要在于RS后来居上,能支持更多种类的匹配模式。副本集对象一般不单独使用,而是作为Deployment的理想状态参数使用。 -
有状态服务集(PetSet)
RC和RS主要是控制提供无状态服务的,其所控制的Pod的名字是随机设置的,一个Pod出故障了就被丢弃掉,在另一个地方重启一个新的Pod,名字变了、名字和启动在哪儿都不重要,重要的只是Pod总数;而PetSet是用来控制有状态服务,PetSet中的每个Pod的名字都是事先确定的,不能更改。需要关联与该Pod对应的状态。适合于PetSet的业务包括数据库服务MySQL和PostgreSQL,集群化管理服务Zookeeper、etcd等有状态服务。使用PetSet,Pod仍然可以通过漂移到不同节点提供高可用,而存储也可以通过外挂的存储来提供高可靠性,PetSet做的只是将确定的Pod与确定的存储关联起来保证状态的连续性。PetSet还只在Alpha阶段,后面的设计如何演变,还要继续观察。
二. 启动
基于Docker启动一个k8s单点服务:
前提
-
你必须拥有一台安装有Docker的机器。
-
你的内核必须支持 memory and swap accounting 。确认你的linux内核开启了如下配置:
CONFIG_RESOURCE_COUNTERS=y CONFIG_MEMCG=y CONFIG_MEMCG_SWAP=y CONFIG_MEMCG_SWAP_ENABLED=y CONFIG_MEMCG_KMEM=y
-
以命令行参数方式,在内核启动时开启 memory and swap accounting 选项:
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
注意:以上只适用于GRUB2。通过查看/proc/cmdline可以确认命令行参数是否已经成功
传给内核:
$cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-3.18.4-aufs root=/dev/sda5 ro cgroup_enable=memory swapaccount=1
第一步. 运行Etcd
docker run --net=host -d gcr.io/google_containers/etcd:2.0.12 /usr/local/bin/etcd --addr=127.0.0.1:4001 --bind-addr=0.0.0.0:4001 --data-dir=/var/etcd/data
第二步. 启动master
docker run \
--volume=/:/rootfs:ro \
--volume=/sys:/sys:ro \
--volume=/dev:/dev \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--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:v1.0.1 \
/hyperkube kubelet --containerized --hostname-override="127.0.0.1" --address="0.0.0.0" --api-servers=http://localhost:8080 --config=/etc/kubernetes/manifests
这一步实际上运行的是 kubelet ,并启动了一个包含其他master组件的[pod](…/userguide/pods.md)。
第三步. 运行service proxy
docker run -d --net=host --privileged gcr.io/google_containers/hyperkube:v1.0.1 /hyperkube proxy --master=http://127.0.0.1:8080 --v=2
三. 基本命令及验证
first,下载kubectl二进制程序。
注意: 在OS/X上你需要通过ssh设置端口转发:
boot2docker ssh -L8080:localhost:8080
-
列出集群中的节点:
kubectl get nodes
-
运行一个应用
// 如果你运行了不同的Kubernetes集群,指定 -s http://localhost:8080 来访问本地集群
kubectl -s http://localhost:8080 run nginx --image=nginx --port=80 -
对外暴露服务
kubectl expose rc nginx --port=80
-
获取刚才service的IP地址。有两个IP,第一个是内部IP(CLUSTER_IP),第二个是外部的负载均衡IP。
kubectl get svc nginx
// 只获取第一个IP(CLUSTER_IP):
kubectl get svc nginx --template={{.spec.clusterIP}} -
通过第一个IP(CLUSTER_IP)访问服务:
curl <insert-cluster-ip-here>
-
关闭集群
上面的各种容器都是运行在 kubelet 程序的管理下,它会保证容器一直运行,甚至容器意外退出时也不例外。所以,如果想关闭集群,你需要首先关闭 kubelet 容器,再关闭其他。
可以使用 docker kill $(docker ps -aq) 。注意这样会关闭Docker下运行的所有容器,请谨慎使用。