栏目头部广告

了解UK8S原理与单节点测试环境部署

一、认识kubernetes

1.1 K8S简介

官网:https://kubernetes.io/

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上运行着kubeapiserverkube-controller-managerkube-scheduler,它们实现了资源管理、pod调度、弹性伸缩、安全控制、系统监控、纠错等功能Node是工作节点,运行应用程序,提供服务。Node上的最小单元是podNode上运行着kubernetesdkubelet(对pod进行管理)、kube-proxy(代理实现负载均衡,资源调度)服务进程,它们负责pod的创建、启动、监控、重启、销毁,以及实现负载均衡。

【注】service是由node组成,node是由pod组成的,pod是由容器组成的。

通过一组图了解kubernetes各个元素的关系:

了解UK8S原理与单节点部署测试(图1)

1.2 Kubernetes架构

Kubernetes的架构是典型的master/Slave架构。Master负责总体的协调控制,Slave负责具体的任务。

(1)Master/Slave的组件如下:

了解UK8S原理与单节点部署测试(图2)

了解UK8S原理与单节点部署测试(图3)

(2)Pod构成

了解UK8S原理与单节点部署测试(图4)

(3)Pod、RC与Service的关系

了解UK8S原理与单节点部署测试(图5)

【注意】现在的版本已经不再使用RC,但学习必须是要学的。

扩容和升级需要一个关键的东西,Replication controllerRC),RC需要包含3个关键信息。

ž   目标pod的定义

ž   目标pod需要运行的副本数量(replicas

ž   要监控的目标pod的标签(label

工作过程:RC里定义好3个指标,kubernetes会根据RC定义的label筛选出对应的pod,并实时监控其状态和数量,当实例数量少于定义的副本数(replicas),则会根据RC定义的pod模板来创建新的pod,然后将此pod调度到合适的Node上启动并运行。该过程完全自动化,无需人工干涉。

1.3 ClusterIP Proxy

了解UK8S原理与单节点部署测试(图6)

文章推荐-容器端口映射: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

了解UK8S原理与单节点部署测试(图7)

[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会失败,具体错误信息如下:

了解UK8S原理与单节点部署测试(图8)

【注】所有:号后面和-后面都有一个空格。

报错说明:如遇到下面这些错,都是因为格式问题。复制时,空格或制表符都是很严格的

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

了解UK8S原理与单节点部署测试(图9)

【注】registry.access.redhat.com/rhel7/pod-infrastructure (k8s官方pod

[root@k8s ~]# kubectl get rc

了解UK8S原理与单节点部署测试(图10)

了解UK8S原理与单节点部署测试(图11)

CrashLoopBackOff 告诉我们,Kubernetes 正在尽力启动这个 Pod,但是一个或多个容器已经挂了,或者正被删除。

[root@k8s ~]# kubectl get pods

了解UK8S原理与单节点部署测试(图12)

(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

了解UK8S原理与单节点部署测试(图13)

【注】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

了解UK8S原理与单节点部署测试(图14)

了解UK8S原理与单节点部署测试(图15)

了解UK8S原理与单节点部署测试(图16)

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

了解UK8S原理与单节点部署测试(图17)

[root@k8s ~]# curl 10.254.39.3:8080/demo/   #容器web IP

了解UK8S原理与单节点部署测试(图18)

[root@k8s ~]# curl 10.9.33.102:30001/demo/  #物理机内网IP

了解UK8S原理与单节点测试环境部署(图19)

[root@k8s ~]# iptables -nvL

了解UK8S原理与单节点部署测试(图20)

[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

了解UK8S原理与单节点部署测试(图21)

[root@k8s ~]# mysql -uroot -h10.254.212.149 -p123456

了解UK8S原理与单节点部署测试(图22)

MySQL [(none)]> use  HPE_APP ;

了解UK8S原理与单节点部署测试(图23)

了解UK8S原理与单节点部署测试(图24)

2.6 删除Pod

[root@k8s ~]# kubectl delete -f mysql-rc.yaml

作者:UStarGao
链接:https://www.starcto.com/k8s/183.html
来源:STARCTO
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处

UCloud云平台推荐


UCloud新用户专属注册连接

UCloud CDN超值特惠专场

UCloud全球云主机(UHost/VPS)大促页面

UCloud快杰云主机大促页面

文章页广告

随便看看

栏目底部广告
`