一、Kubernetes 相关概念
1. Kubernetes 是一个开源的容器集群管理系统,主要用来自动化部署容器 、自动扩展与收缩容器规模 、提供容器间的负载均衡
2. Node:Node(节点)也就是宿主机,宿主机可以是物理机 、云主机 、虚拟机等等,我们可以在一个宿主机上跑多个容器(container)
3. Pod:我们可以在一个宿主机上跑多个容器,为了高可用和负载均衡,我们把多个容器组成一个Pod,同一个Pod里的容器共享同一个网络命名空间,可以使用 localhost 互相通信;
每个Pod里都有一个特殊的容器(Pause),这个容器提供网络栈和数据卷,其他普通容器共享这个容器的资源,因此同一个Pod内容器之间的通信和数据交换更为高效
4. Service:多个功能相同的Pod组成一个Service(微服务),Kubernetes 集群是由多个 Service 组成的,我们可以通过 ip:port 的形式来访问Service;
多个功能相同的Pod,我们要怎么区分呢?我们会给每个Pod打一个Label(标签),Service 通过 Label 来找到指定的Pod
5. Kubernetes Master:在一个Kubernetes集群里面,会有多个Node节点,而 Kubernetes Master 这个节点作为主节点,用来管理其他的Node节点,包括资源管理 、Pod调度 、弹性伸缩 、安全控制 、系统监控 、纠错等功能;
Kubernetes Master 上运行的 Replication Controller(RC)就是用来控制弹性伸缩的,通过控制Pod的数量来实现。
二、Kubernetes 实例
1. 这里通过一个小例子,更好地理解 Kubernetes 相关术语之间的关系
2. 首先创建一个 MySQL Service,然后创建一个 Web Service,最后用 Web Service 去连接 MySQL Service
3. 环境:一台 CentOS 7.5 机器(如果低于7.5需要 yum update 一下)、内存 3G 或以上
① 关闭 firewalld 和 selinux
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
② 安装 etcd 和 kubernetes,etcd 是用来存储Kubernetes集群里的配置文件的
[root@localhost ~]# yum install -y etcd kubernetes
③ 修改配置文件
[root@localhost ~]# vim /etc/sysconfig/docker # 将 --selinux-enabled 改为 --selinux-enabled=false --insecure-registry gcr.io
[root@localhost ~]# vim /etc/kubernetes/apiserver # 将 --admission_control 参数中的 ServiceAccount 删除
④ 其他准备工作
[root@localhost ~]# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
[root@localhost ~]# rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm |cpio -iv --to-stdout ./etc/rhsm/ca/redhatuep.pem > /etc/rhsm/ca/redhat-uep.pem
[root@localhost ~]# vim /etc/docker/daemon.json # 配置加速器 { "registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"] }
⑤ 按顺序启动所有服务
for s in etcd docker kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy do systemctl start $s done
⑥ 创建一个 RC 文件,用来控制 MySQL 的 Pod 数量
[root@localhost ~]# vim mysql-rc.yaml apiVersion: v1 kind: ReplicationController # RC(副本控制器) metadata: name: mysql # RC的名字 spec: replicas: 1 # 控制Pod的数量为1 selector: app: mysql template: metadata: labels: app: mysql # 定义Pod的标签,以便Service能够找到Pod spec: containers: # 定义Pod里的容器 - name: mysql image: mysql:5.6 ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: "123456"
[root@localhost ~]# kubectl create -f mysql-rc.yaml # 根据RC文件来创建一个RC [root@localhost ~]# kubectl get rc # 查看是否创建了RC NAME DESIRED CURRENT READY AGE mysql 1 1 0 1m
[root@localhost ~]# kubectl get pod # 查看Pod数量,只有状态是Running的时候才是创建完了,否则的就是还在下载镜像的阶段 NAME READY STATUS RESTARTS AGE mysql-dr556 0/1 Running 0 3m
⑥ 创建一个 MySQL Service
[root@localhost ~]# vim mysql-service.yaml apiVersion: v1 kind: Service metadata: name: mysql spec: ports: - port: 3306 selector: app: mysql
[root@localhost ~]# kubectl create -f mysql-service.yaml # 创建 MySQL Service [root@localhost ~]# kubectl get service # 查看是否创建了 MySQL Service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 19m mysql 10.254.211.198 <none> 3306/TCP 8s
[root@localhost ~]# mysql -uroot -p123456 -h10.254.211.198 # 创建完 MySQL Service,我们就可以使用 ip:port 的方式来访问了 Welcome to the MariaDB monitor. Commands end with ; or g. # 如果没有mysql命令,可以通过 yum install -y mysql 来安装 Your MySQL connection id is 1 Server version: 5.6.42 MySQL Community Server (GPL) MySQL [(none)]>
⑦ 创建一个 RC 文件,用来控制 Web 的 Pod 数量,并制定去连接 MySQL Service
[root@localhost ~]# vim web-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.211.198' # 这里的IP需要通过 kubectl get service 查看 mysql 的 cluster ip - name: MYSQL_SERVICE_PORT value: '3306'
[root@localhost ~]# kubectl create -f web-rc.yaml # 根据RC文件来创建一个RC [root@localhost ~]# kubectl get rc # 查看是否创建了RC NAME DESIRED CURRENT READY AGE mysql 1 1 1 19m myweb 1 1 0 46s
[root@localhost ~]# kubectl get pod # 查看Pod数量,只有状态是Running的时候才是创建完了,否则的就是还在下载镜像的阶段 NAME READY STATUS RESTARTS AGE mysql-dr556 1/1 Running 0 19m myweb-5tlwc 0/1 Running 0 55s
⑦ 创建 Web Service
[root@localhost ~]# vim web-service.yaml kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 nodePort: 30001 selector: app: myweb
[root@localhost ~]# kubectl create -f web-service.yaml # 创建 Web Service [root@localhost ~]# kubectl get service # 查看是否创建了 Web Service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 35m mysql 10.254.211.198 <none> 3306/TCP 16m myweb 10.254.103.27 <nodes> 8080:30001/TCP 6s
⑧ 测试
[root@localhost ~]# iptables -P FORWARD ACCEPT