了解UK8S原理与单节点测试环境部署
一、认识kubernetes
1.1 K8S简介
Kubernetes is an open-source system for automating deployment, scaling, and management of containerized applications.
Kubernetes是一个开源系统,它主要用来自动部署、扩容缩容和管理容器应用。
It groups containers that make up an application into logical units for easy management and discovery. Kubernetes builds upon 15 years of experience of running production workloads at Google, combined with best-of-breed ideas and practices from the community.
它将诸多应用的容器分为若干个逻辑单元以便于管理和发现。Kubernetes拥有着Google高负载生产环境的15年经验,并结合了社区的优秀思想和实战。
提供service的是容器,为了保证service的高可用,提供service的容器不能只有一个,需要一组。这一组容器我们把它叫做pod。
为了实现service和pod之间的关联,又有了标签(label)的概念,我们把功能相同的pod设定为同一个标签,比如,可以把所有提供mysql服务的pod贴上标签name=mysql,这样mysql service要作用于所有包含name=mysql标签的pod上。
pod运行在Node上,Node可以是一台物理机,也可以是虚拟机,通常一个Node上会运行几百个pod。每个pod里运行着一个特殊的容器,叫做Pause,其他容器叫做业务容器,业务容器共享Pause容器的网络栈和Volume挂载卷,因此同一个pod内的业务容器之间的通信和数据交换更为高效。
在集群管理方面,将集群中的机器划分为一个master节点和一群工作节点Node,其中master上运行着kubeapiserver、kube-controller-manager、kube-scheduler,它们实现了资源管理、pod调度、弹性伸缩、安全控制、系统监控、纠错等功能。Node是工作节点,运行应用程序,提供服务。Node上的最小单元是pod,Node上运行着kubernetesd的kubelet(对pod进行管理)、kube-proxy(代理实现负载均衡,资源调度)服务进程,它们负责pod的创建、启动、监控、重启、销毁,以及实现负载均衡。
【注】service是由node组成,node是由pod组成的,pod是由容器组成的。
通过一组图了解kubernetes各个元素的关系:
1.2 Kubernetes架构
Kubernetes的架构是典型的master/Slave架构。Master负责总体的协调控制,Slave负责具体的任务。
(1)Master/Slave的组件如下:
(2)Pod构成
(3)Pod、RC与Service的关系
【注意】现在的版本已经不再使用RC,但学习必须是要学的。
扩容和升级需要一个关键的东西,Replication controller(RC),RC需要包含3个关键信息。
目标pod的定义
目标pod需要运行的副本数量(replicas)
要监控的目标pod的标签(label)
工作过程:RC里定义好3个指标,kubernetes会根据RC定义的label筛选出对应的pod,并实时监控其状态和数量,当实例数量少于定义的副本数(replicas),则会根据RC定义的pod模板来创建新的pod,然后将此pod调度到合适的Node上启动并运行。该过程完全自动化,无需人工干涉。
1.3 ClusterIP Proxy
文章推荐-容器端口映射:kind:ReplicationController template
二、单节点集群部署测试
2.1 准备工作
(1)关闭firewalld 和selinux
[root@k8s /]# systemctl stop firewalld [root@k8s /]# systemctl disable firewalld [root@k8s /]# setenforce 0
(2)安装etcd和kubernetes
[root@k8s /]# yum install -y etcd kubernetes
【注意】yum安装的k8s版本较低,组件较少,相对来讲部署复杂度较低,适合初学者。但高版本的一些新特性和功能,低版本没有,测试特殊功能时报错,一般就是这个原因。
(3)修改配置文件
# 将--selinux-enabled 改为--selinux-enabled=false --insecure-registry gcr.io [root@k8s /]# vim /etc/sysconfig/docker OPTIONS='--selinux-enabled=false --insecure-registry gcr.io --log-driver=journald --signature-verification=false' # 把--admission_control参数中的ServiceAccount删除 [root@k8s /]# vim /etc/kubernetes/apiserver
[root@k8s /]# yum install python-rhsm-certificates
[root@k8s opt]# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm [root@k8s ~]# rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm |cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem > /etc/rhsm/ca/redhat-uep.pem
(4)配置docker加速器
[root@k8s ~]# vim /etc/docker/daemon.json { "registry-mirrors":["http://hub-mirror.c.163.com"] # 注意前面是2个空格多了报错 }
文章推荐-Docker镜像加速:Docker mirror speed
2.2 按顺序启动所有服务
for s in etcd docker kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy do systemctl start $s done [root@k8s ~]# rpm -q kubernetes # 查看K8S版本 kubernetes-1.5.2-0.7.git269f928.el7.x86_64 # 通过yum安装的版本较老
2.3 MySQL容器部署
(1)创建一个mysql rc文件:用来定义pod
[root@k8s ~]# vim mysql-rc.yaml apiVersion: v1 kind: ReplicationController # 副本控制器RC metadata: name: mysql # RC的名称,全局唯一 spec: replicas: 1 # pod副本的期待数量 selector: app: mysql # 符合目标的pod拥有此标签 template: # 根据此模板创建Po的副本(实例) metadata: labels: app: mysql # pod副本拥有的标签,对应RC的Selector spec: containers: # Pod内容器的定义部分 - name: mysql # 容器的名称 image: mysql:5.6 # 容器对应的Docker image ports: - containerPort: 3306 #容器应用监听的端口号 env: #注入容器内的环境变量 - name: MYSQL_ROOT_PASSWORD value: "123456"
【注】这里需要指定环境变量MYSQL_ROOT_PASSWORD,否则创建pod会失败,具体错误信息如下:
【注】所有:号后面和-后面都有一个空格。
报错说明:如遇到下面这些错,都是因为格式问题。复制时,空格或制表符都是很严格的
error: error validating "mysql-rc.yaml": error validating data: found invalid field 1abels for v1.ObjectMeta; if you choose to ignore these errors, turn validation off with --validate=false
error: yaml: line 15: did not find expected key
[root@k8s ~]# kubectl create -f mysql-rc.yaml replicationcontroller "mysql" created
【注】registry.access.redhat.com/rhel7/pod-infrastructure (k8s官方pod)
[root@k8s ~]# kubectl get rc
CrashLoopBackOff 告诉我们,Kubernetes 正在尽力启动这个 Pod,但是一个或多个容器已经挂了,或者正被删除。
[root@k8s ~]# kubectl get pods
(2)创建一个mysql svc文件
【注】创建关联serveice简称svc
[root@k8s ~]# vim mysql-svc.yaml apiVersion: v1 kind: Service metadata: name: mysql spec: ports: - port: 3306 selector: app: mysql [root@k8s ~]# kubectl create -f mysql-svc.yaml [root@k8s ~]# kubectl get svc
【注】web rc连接数据库的IP即是这个10.254.212.149
2.4 Web容器部署
(1)创建一个web rc文件
[root@k8s ~]# vim myweb-rc.yaml kind: ReplicationController metadata: name: myweb spec: replicas: 1 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: kubeguide/tomcat-app:v1 ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: '10.254.212.149' #这里的IP需要通过kubect get svc 查看mysql的cluster ip - name: MYSQL_SERVICE_PORT value: '3306' [root@k8s ~]# kubectl create -f myweb-rc.yaml replicationcontroller "myweb" created
(2)创建一个web svc
[root@k8s ~]# vim myweb-svc.yaml kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 nodePort: 30001 # 将容器集群IP暴露的8080端口,暴露到物理机IP的30001端口 selector: app: myweb
【注】端口必须大于30000 type=NodePort和nodePort=30001的两个属性,表明此Service开启了NodePort方式的外网访问模式。
[root@k8s ~]# kubectl create -f myweb-svc.yaml service "myweb" created
2.5 测试验证
云主机外网IP:117.50.2.240 对应内网IP:10.9.33.102
myweb IP:10.254.39.3 mysql IP:10.254.212.149
[root@k8s ~]# netstat -antulp
[root@k8s ~]# curl 10.254.39.3:8080/demo/ #容器web IP
[root@k8s ~]# curl 10.9.33.102:30001/demo/ #物理机内网IP
[root@k8s ~]# iptables -nvL
[root@k8s ~]# iptables -P FORWARD ACCEPT [root@k8s ~]# sysctl net.ipv4.ip_forward=1 #开启IP转发 iptables -t nat -A DOCKER -p tcp --dport 30001 -j DNAT --to-destination 10.254.39.3:8080 [root@k8s ~]# systemctl restart docker
[root@k8s ~]# mysql -uroot -h10.254.212.149 -p123456
MySQL [(none)]> use HPE_APP ;
2.6 删除Pod
[root@k8s ~]# kubectl delete -f mysql-rc.yaml
作者:UStarGao
链接:https://www.starcto.com/k8s/183.html
来源:STARCTO
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
UCloud云平台推荐
随便看看
- 2022-04-02Docker可视化管理工具-Portainer
- 2023-08-18ubuntu修改hosts解析导致sudo命令卡住/hang住
- 2021-05-09Fping网络探测工具的使用
- 2021-03-20Dockerfile构建容器镜像,搭建LNMP网站平台
- 2021-11-30UCloud NVMe机型MySQL数据库性能压测-sysbench