Kubernetes 简介

一、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

 

    

 

 

 

 

    

posted @ 2018-12-30 11:14  孔雀东南飞  阅读(402)  评论(0编辑  收藏  举报