本文为转载,原文:kubernetes(k8s) 介绍及简单例子
kubernetes1. 介绍
Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。
使用Kubernetes可以:
- 自动化容器的部署和复制
- 随时扩展或收缩容器规模
- 将容器组织成组,并且提供容器间的负载均衡
- 很容易地升级应用程序容器的新版本
- 提供容器弹性,如果容器失效就替换它,等等…
Kubernetes解决的问题:
- 调度 - 容器应该在哪个机器上运行
- 生命周期和健康状况 - 容器在无错的条件下运行
- 服务发现 - 容器在哪,怎样与它通信
- 监控 - 容器是否运行正常
- 认证 - 谁能访问容器
- 容器聚合 - 如何将多个容器合并成一个工程
Kubernetes组件组成:
- kubectl
客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口。 - kube-apiserver
作为整个系统的控制入口,以REST API服务提供接口。 - kube-controller-manager
用来执行整个系统中的后台任务,包括节点状态状况、Pod个数、Pods和Service的关联等。 - kube-scheduler
负责节点资源管理,接受来自kube-apiserver创建Pods任务,并分配到某个节点。 - etcd
负责节点间的服务发现和配置共享。 - kube-proxy
运行在每个计算节点上,负责Pod网络代理。定时从etcd获取到service信息来做相应的策略。 - kubelet
运行在每个计算节点上,作为agent,接受分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。 - DNS
一个可选的DNS服务,用于为每个Service对象创建DNS记录,这样所有的Pod就可以通过DNS访问服务了。
2. 环境搭建
2.1 安装
centos系统下的yum 安装:
首先要关闭防火墙
systemctl stop firewalld
如果服务器已安装过docker, 请先卸载
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
master
yum install -y etcd kubernetes
2.2. 配置
docker配置
编辑/etc/sysconfig/docker
文件。修改OPTIONS
。
kube-apiserver配置
编辑/etc/kubernetes/apiserver
文件,把--admission_control
中的参数ServiceAccount
删除。
2.3. 启动
依次执行以下命令启动服务
systemctl start etcd
systemctl start docker
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl start kubelet
systemctl start kube-proxy
至此,我们的环境以及安装好了
3. 简单的例子
通过上述步骤,实际上我们已经搭建了一个单节点的集群,下面将介绍一个简单的Mysql的部署的例子。
3.1. RC创建
创建mysql-rc.yaml文件,并根据需求填写以下内容:
apiVersion: v1
kind: ReplicationController #副本控制器RC
metadata:
name: mysql #RC的名称,全局唯一
spec:
replicas: 1 #Pod副本的期待数量
selector:
app: mysql #符合目标的Pod拥有此标签
template: #根据此模板创建Pod的副本(实例)
metadata:
labels:
app: mysql #Pod副本拥有的标签,对应RC的Selector
spec:
containers: #Pod内容器的定义部分
- name: mysql #容器的名称
image: 192.168.77.53:5000/mysql:5.7.20 #容器对应的Docker image
ports:
- containerPort: 3306 #容器应用监听的端口号
env: #注入容器内的环境变量
- name: MYSQL_ROOT_PASSWORD
value: "123456"
yaml定义文件中的kind属性,用来表示此资源对象的类型,比如这里的值为ReplicationController
,表示这是一个RC;spec一节中是RC的相关属性定义,比如spec.selector
是RC的Pod标签(label)选择器,即监控和管理拥有这些标签的Pod实例,确保当前集群上始终有且仅有replicas个Pod实例在运行,这里我们设置replicas=1表示只运行一个MySQL Pod实例。当集群中运行的Pod实例数量小于replicas时,RC会根据spec.template
一节中定义的Pod模板来生成一个新的Pod实例,spec.template.metadata.labels
指定了改Pod的标签,需要特别注意的是:这里的labels必须匹配之前的spec.selector
,否则此RC每次创建了一个无法匹配Label的Pod,就会不停的尝试创建新的Pod,最终陷入“只为他人做嫁衣”的悲惨世界中。
编辑好mysql-rc.yaml
文件之后,为了将它发布到Kubernetes集群中,我们在Master节点中该文件目录下执行以下命令:
kubectl create -f mysql-rc.yaml
create
成功之后可以执行以下命令查看结果:
kubectl get rc
kubectl get pods
get rc
get pods
3.2. Service创建
上一步已经完成了pod和ReplicationController的创建,这里将创建一个对外的服务。
新建mysql-svc.yaml
文件,并写入以下内容:
apiVersion: v1
kind: Service #表明是kubernetes service
metadata:
name: mysql #服务名称,全局唯一
spec:
type: NodePort #指定类型为node port
ports:
- port: 3306 #虚拟端口号
nodePort: 30001 #节点端口号
selector:
app: mysql #标签选择
其中,metadata.name
是服务名称,port属性则定义了服务的虚拟端口,spec.selector
确定了哪些Pod副本(实例)对应到本服务。注意type=NodePort
和nodePort=30001
的两个属性,表明此服务开启了NodePort方式的外网访问模式,且访问端口为30001。
之后我们同样执行以下命令,创建服务:
kubectl create -f mysql-svc.yaml
create service
完成之后,可使用以下命令查看结果:
kubectl get svc
get svc
这个时候,我们就可以通过外网来访问我们的数据库啦,当然端口号是30001.
4. 问题及处理
- ContainerCreating
在执行kubectl create
之后,执行kubectl get pods
, 发现pod的状态一直是ContainerCreating。
err
执行kubectl describe pod podname
可查看错误信息
info
这个时候,我们发现缺少/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt
文件。于是就进这个目录看看是不是真的没有。
err
发现这个文件还真是存在的。那为什么会说不存在呢。换个命令试下
err
这个文件会指向另外一个文件。我这里再次查找之后,发现/etc/rhsm/ca/redhat-uep.pem
文件确实不存在。网上搜了一下。说是安装rhsm
可以解决。于是执行以下命令:
yum install -y *rhsm*
安装好之后,/etc/rhsm/ca/
目录下还是空的。还是没有解决问题,依然报之前的错。
换种思路吧。既然pull不到这个镜像,我们就手动执行以下命令用另外一个镜像来代替它:
docker pull docker.io/kubernetes/pause
然后修改配置文件/etc/kubernetes/kubelet
,将KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest""
改成KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=docker.io/kubernetes/pause:3.0"
。再重启kubelet即可。
5. 完
转载请注明出处
kubernetes(k8s) 介绍及简单例子
网友评论