微服务有了Docker的加持快速的流行了起来,但是如何管理这些Docker容器呢?Kubernetes是Google开发的,一种适用于生产环境大规模编排容器的管理平台。本文将在单机上以一个简单的例子来介绍Kubernetes的使用。
安装Kubernetes
1 | yum install -y etcd kubernetes |
修改apiserver配置文件,将--admission-control参数中的ServiceAccount删除。 1
2/etc/kubernetes/apiserver
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
启动所有的Kubernetes服务: 1
2
3
4
5
6
7systemctl start etcd
systemctl start docker
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl start kubelet #集群环境下运行在slave机器上
systemctl start kube-proxy #集群环境下运行在slave机器上
启动Pod
Pod是Kubernetes管理的最小资源单位,可以看做是逻辑上的一台机器。Node节点上可运行多个Pod,一个Pod内部可有多个Docker Container,同一个Pod内部的Container共享网络和磁盘。以下展示如何创建Pod,以nginx应用为例,首先创建Pod的yaml文件: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19apiVersion: v1
kind: ReplicationController #该类型可以一次性创建多个Pod
metadata:
name: nginx #rc的名字,生成的Pod以此为前缀
spec:
replicas: 3 #创建的pod数目,pod是逻辑上的一台机器
selector: #指定该RC管理哪些pod,通过Label识别
app: nginx #管理Label为app:nginx的pod
template:
metadata:
name: nginx
labels:
app: nginx #设置pod的Label,在selector中可以进行选择管理。通常的做法可以配置不同环境(测试、灰度、正式)的Label,用户管理不同环境的Pod。
spec:
containers: # 一个pod中可有多个container,同一个pod内的container共享IP地址和端口
- name: nginx #横杠代表数组元素,通过数组可以设置多个container
image: nginx #docker的image名字,默认从gcr.io的库中拉取
ports:
- containerPort: 80 #docker中的端口,同一个pod中的container端口不能相同
启动Pod 1
2sudo kubectl create -f ningx.yaml #启动Pod
sudo kubectl get pods #查看Pod运行情况
启动时候有可能会出现错误导致Pod一直处在ContainerCreating状态,使用命令:sudo kubectl describe pods进行查看,如果出现如下错误: 1
Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"
1
2
3yum install -y *rhsm*
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
启动Service
上面已经启动了3个Pod,但是Pod部署时候并不确定会部署在哪台机器上,所以需要一种类似名字服务的机制,来保证能找到对应的Pod服务。Kubenetes Service就是这样的用处,首先定义yaml文件: 1
2
3
4
5
6
7
8
9
10
11apiVersion: v1
kind: Service #类似于
metadata:
name: nginx #service名字
spec:
type: NodePort #该类型可以使得外部服务通过node:nodePort的方式访问service,另外还有LoadBlance的类型也支持外部访问
ports:
- port: 80 #kubernetes内部服务可通过VIP:80访问service
nodePort: 30001 #设定nodePort,外部服务可使用node:nodePort访问service
selector:
app: nginx #该service管理Label为app:nginx的所有Pod
使用命令:sudo kubectl create -f nginx-sv.yaml 启动Service,并使用 sudo kubectl get service 查看Service状态:
访问服务
内部服务访问nginx:curl 'http://10.254.149.154:80/'
外部服务访问nginx:curl 'http://ip:30001',其中ip为启动Kubenetes service的物理机器IP地址