运维开发网

kubernetes1

运维开发网 https://www.qedev.com 2020-10-14 12:19 出处:51CTO 作者:小伟996
认识kubernetesKubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。使用Kubernetes可以:自动化容器的部署和复制随时扩展或收缩容器规模将容器组

认识kubernetes

       Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。

使用Kubernetes可以:

  • 自动化容器的部署和复制

  • 随时扩展或收缩容器规模

  • 将容器组织成组,并且提供容器间的负载均衡

  • 很容易地升级应用程序容器的新版本

  • 提供容器弹性,如果容器失效就替换它,等等...

在kubernetes中,service是核心,我们并不需要太多关注kubernetes里面是怎么工作的,我们只需要关心它给我们提供什么service.就像Docker容器可以提供一个mysqld的服务、 web服务等。

它需要拥有一个唯一的名字,有ip : port对外提供服务。

提供service的是容器,为了保证service的高可用.提供service的容器不能只有一个,需要-组。 这一组容器我们把它叫做pod。(service是有pop组成的,而pop是由容器组成的)

为了实现sevice和pod之间的关联。又有了标签(label)的概念我们把功能相同的pod设定为同一 个标签,比如,可以把所有提供mysql服务的pod贴 上标签name =mysql ,这样mysql service要作用于所有包含name = mysq标签的pod上。

pod运行在Node.上, Node可以是一台物理机,也可以是虚拟机,通常-个Node,上会运行几百个pod.每个pod里运行着-个特殊的容器,叫做Pause。其他容器叫做业务容器,业务容器共享Pause容器的网络栈和Volume挂载卷,因此同-个pod内的业务容器之间的通信和数据交换更为高效。

在集群管理方面, kubernetes将集群中的机器划分为-个master节点和一群工作节点Node ,其中master,上运行着kube- apiserver. kube-controller-manager. kube-scheduler 。它们实现了资源管里、pod调度、弹性伸缩、安全控制、系统监控、纠错等功能。Node是工作节点,运行应用程序,提供服务。Node,上的最小单元是pod,Node.上运行着kubernetesd的kubelet. kube -proxy服务进程,它们负责pod的创建、启动、 监控、重启、销毁,以及实现负载均衡。

kubernetes1

上图可以看到如下组件,使用特别的图标表示Service和Label:

  • Pod

  • Container(容器)

  • Label(

    kubernetes1

    )(标签)

  • Replication Controller(复制控制器)

  • Service(

    kubernetes1

    )(服务)

  • Node(节点)

  • Kubernetes Master(Kubernetes主节点)

kubernetes中几个概念

  • container 容器 提供一个让应用运行的环境。

  • pod 在kubernetes中的一个运行单位,里面包含任意数量的容器。通常是两个。其中有一个叫Pause的容器,它作用网络栈和挂载卷。让用一个pod中的容器通讯更加高效。

  • replication controller(RC)提供一个管理任意数量pod的方法。它可以复制任意数量的pod模板。让kubernetes可以对pod进行扩容 升级

  • service 它是所有pod的整合成的服务环境 是kubernetes核心,其使用label标签来管理pods。

  • node 节点 可以是一台物理机,云主机,虚拟机也可以。通常一个node可以运行多个pod。从集群上看kubernetes分一个master节点和多个node节点。 master上运行着kubeapiserver、kube-controller-manager、kube-scheduler,它们实现了资源管理、pod调度、弹性伸缩、安全控制、系统监控、纠错等功能。Node是工作节点,运行应用程序,提供服务。Node上的最小单元是pod,Node上运行着kubernetesd的 kubelet、kube-proxy服务进程,它们负责pod的创建、启动、监控、重启、销毁,以及实现负载均衡。

从一个例子开始

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

1)目标pod的定义

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

3)要监控的目标pod的标签( Label )

工作过程:RC里定义好3个指标,kubernetes会根据RC定义的Label筛选出对应的pod,并实时监控其状态和数量,当实例数量 少于定义的副本数(replicas),

则会根据RC定义的pod模版来创建新的pod,然后将此pod调度到合适的Node上启动并运行。 该过程完全自动化,无需人工干涉。

为了顺利安装kubernetes 先把系统升级到最新版本(centos7.5及以上就行),并且让机器使用3G内存(至少大于2G)

查看系统版本

[[email protected] ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

1.先关闭seLinux和firewall

[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# systemctl disable firewalld
[[email protected] ~]# setenforce 0

安装和etcd和kubernetes (安装过程中会自动安装Docker软件)

etcd:是用来存储kubernetes集群里边的配置文件的

[[email protected] ~]# yum install -y etcd kubernetes
正在解决依赖关系
--> 正在检查事务
---> 软件包 etcd.x86_64.0.3.3.11-2.el7.centos 将被 安装
---> 软件包 kubernetes.x86_64.0.1.5.2-0.7.git269f928.el7 将被 安装

修改配置文件etcd是用来存储配置文件的数据库,这里用来存储k8s的配置文件,它也是分布式的

[[email protected] ~]# vim /etc/sysconfig/docker

将--seLinux-enabled 改为 --seLinux-enabled=false --insecure-registry gcr.io --seLinux-enabled=false --insecure-registry gcr.io

docker默认走的是https我们改成走http

更改apiserver配置文件,把“ServiceAccount”参数删掉

[[email protected] ~]# vim /etc/kubernetes/apiserver

准备工作

下载一个镜像文件

[[email protected] ~]# yum install -y python-rhsm-certificates
软件包 python-rhsm-certificates-1.19.10-1.el7_4.x86_64 被已安装的 subscription-manager-rhsm-certificates-1.24.26-3.el7.centos.x86_64 取代
无须任何处理

如果出现上方情况需要直接wget安装包

[[email protected] ~]# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
--2020-05-26 17:22:59--  http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
正在解析主机 mirror.centos.org (mirror.centos.org)... 198.15.72.18, 2607:f2d8:1:e::10
正在连接 mirror.centos.org (mirror.centos.org)|198.15.72.18|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:42188 (41K) [application/x-rpm]
正在保存至: “python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm”

100%[=================================================================================================================================================>] 42,188      94.7KB/s 用时 0.4s   

2020-05-26 17:23:00 (94.7 KB/s) - 已保存 “python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm” [42188/42188])

在执行下方命令

[[email protected] ~]# 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 

./etc/rhsm/ca/redhat-uep.pem
17 块

ps:不进行上边两项操作实验可能会出问题

配置docker加速器

[[email protected] ~]# 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

(笨方法命令启动格式)

[[email protected] ~]# systemctl start etcd
[[email protected] ~]# systemctl start docker
[[email protected] ~]# systemctl start kube-apiserver
[[email protected] ~]# systemctl start kube-controller-manager
[[email protected] ~]# systemctl start kube-scheduler
[[email protected] ~]# systemctl start kubelet
[[email protected] ~]# systemctl start kube-proxy

创建rc文件(用来定义pod)

[[email protected] ~]# vim 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: mysql:5.6 #容器对应的Docker image
        ports:
        - containerPort: 3306 #容器应用监听的端口号
        env: #注入容器内的环境变量
        - name: MYSQL_ROOT_PASSWORD
          value: "123456" #密码

发布rc到集群上

kubectl create -f mysql-rc.yaml

[[email protected] ~]# kubectl create -f mysql-rc.yaml
replicationcontroller "mysql" created
[[email protected] ~]# tail -f /var/log/messages 看日志发现他在下载mysql的镜像
May 28 15:12:45 localhost kubelet: W0528 15:12:45.937659    1978 conversion.go:110] Could not get instant cpu stats: time delta unexpectedly small
May 28 15:12:45 localhost kubelet: W0528 15:12:45.943792    1978 conversion.go:110] Could not get instant cpu stats: time delta unexpectedly small
May 28 15:12:45 localhost kubelet: W0528 15:12:45.944735    1978 conversion.go:110] Could not get instant cpu stats: time delta unexpectedly small
May 28 15:14:23 localhost chronyd[816]: Selected source 162.159.200.1
May 28 15:14:29 localhost kube-controller-manager: I0528 15:14:29.324336    1964 event.go:217] Event(api.ObjectReference{Kind:"ReplicationController", Namespace:"default", Name:"mysql", UID:"deeea09e-a0b2-11ea-9ee6-000c29be3761", APIVersion:"v1", ResourceVersion:"25934", FieldPath:""}): type: 'Normal' reason: 'SuccessfulCreate' Created pod: mysql-60jqv
May 28 15:14:29 localhost kube-controller-manager: I0528 15:14:29.328555    1964 replication_controller.go:322] Observed updated replication controller mysql. Desired pod count change: 1->1
May 28 15:14:29 localhost kube-scheduler: I0528 15:14:29.331426    1971 event.go:217] Event(api.ObjectReference{Kind:"Pod", Namespace:"default", Name:"mysql-60jqv", UID:"def09401-a0b2-11ea-9ee6-000c29be3761", APIVersion:"v1", ResourceVersion:"25935", FieldPath:""}): type: 'Normal' reason: 'Scheduled' Successfully assigned mysql-60jqv to 127.0.0.1
May 28 15:14:29 localhost dockerd-current: time="2020-05-28T15:14:29.341202017+08:00" level=error msg="Handler for GET /v1.26/images/registry.access.redhat.com/rhel7/pod-infrastructure:latest/json returned error: No such image: registry.access.redhat.com/rhel7/pod-infrastructure:latest"
May 28 15:14:29 localhost kube-controller-manager: I0528 15:14:29.344225    1964 replication_controller.go:322] Observed updated replication controller mysql. Desired pod count change: 1->1
May 28 15:15:12 localhost kube-controller-manager: W0528 15:15:12.516215    1964 reflector.go:319] pkg/controller/garbagecollector/garbagecollector.go:768: watch of <nil> ended with: 401: The event in requested index is outdated and cleared (the requested history has been cleared [24990/24792]) [25989]

查看rc的状态

kubectl get rc

[[email protected] ~]# kubectl get rc
NAME      DESIRED   CURRENT   READY     AGE
mysql     1         1         0         3m

查看pod的创建情况

[[email protected] ~]# kubectl get pod
NAME          READY     STATUS              RESTARTS   AGE
mysql-60jqv   0/1       ContainerCreating   0          5m

Pod的状态处于ContainerCreating,需要等到状态为Runing才算成功

这个是k8s官方的一个pod的,这个必须要有

[[email protected] ~]# docker images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
registry.access.redhat.com/rhel7/pod-infrastructure   latest              99965fb98423        2 years ago         209 MB

耐心等待发现mysql的镜像也下载下来了

[[email protected] ~]# docker images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
docker.io/mysql                                       5.6                 9e4a20b3bbbc        7 days ago          302 MB
registry.access.redhat.com/rhel7/pod-infrastructure   latest              99965fb98423        2 years ago         209 MB

成功启动

[[email protected] ~]# kubectl get pod
NAME          READY     STATUS    RESTARTS   AGE
mysql-60jqv   1/1       Running   0          15m  #Running表示已经启动为容器

创建mysql的svc/service文件

[[email protected] ~]# vim mysql-svc.yaml
apiVersion: v1
kind: Service #表明是K8s Service
metadata:
  name: mysql #Service的全局唯一名称
spec:
  ports:
    - port: 3306 #Service提供服务的端口号
  selector: #Service对应的Pod拥有这里定义的标签
    app: mysql

发布service到集群上

kubectl create -f mysql-svc.yaml

[[email protected] ~]# kubectl create -f mysql-svc.yaml
service "mysql" created

在查看就有了mysql

[[email protected] ~]# kubectl get svc
NAME         CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
kubernetes     10.254.0.1     <none>        443/TCP    7d
mysql        10.254.89.32   <none>        3306/TCP   7s

Ps:不同的service之间都是通过CLUSTER-IP来实现通讯的;CLUSTER-IP其实就是service的IP,通过这个ip和PORT就可以访问mysql了。

我们没有安装mysql,直接yum install -y mysql来安装一个进行连接测试

[[email protected] ~]# mysql -u root -p123456 -h10.254.89.32
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.48 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.02 sec)

MySQL [(none)]>

定义一个webapp的rc文件并发布

[[email protected] ~]# 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.89.32' #这里的IP需要通过kubectl get svc 查看mysql的cluster ip;如果有DNS服务则不需要填写ip直接写mysql就可以解析到ip
          - name: MYSQL_SERVICE_PORT
            value: '3306'
发布
[[email protected] ~]# kubectl create -f web-rc.yaml

等一下就好了

[[email protected] ~]# docker images ##最后面看到已经拉下来了
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
docker.io/mysql                                       5.6                 9e4a20b3bbbc        13 days ago         302 MB
registry.access.redhat.com/rhel7/pod-infrastructure   latest              99965fb98423        2 years ago         209 MB
docker.io/kubeguide/tomcat-app                        v1                  a29e200a18e9        3 years ago         358 MB
[[email protected] ~]# kubectl get pod ##myweb-317p2的状态也是Running启动成功了
NAME          READY     STATUS    RESTARTS   AGE
mysql-60jqv   1/1       Running   0          6d
myweb-317p2   1/1       Running   0          3m
[[email protected] ~]#

定义一个webapp的svc文件并发布

[[email protected] ~]# vim web-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:
     - port: 8080 ##容器的端口
       nodePort: 30001 ##映射到物理机的端口
  selector:
    app: myweb

ps:nodPort,设置了这个就可以通过本机ip加这个端口访问service,端口最低范围是30000

创建之前先看下myweb是否为runing

[[email protected] ~]# kubectl get pod
NAME          READY     STATUS    RESTARTS   AGE
mysql-60jqv   1/1       Running   0          49d
myweb-317p2   1/1       Running   0          43d
[[email protected] ~]# kubectl create -f web-svc.yaml
service "myweb" created
[[email protected] ~]# kubectl get svc
NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   10.254.0.1      <none>        443/TCP          50d
mysql        10.254.89.32    <none>        3306/TCP         43d
myweb        10.254.31.188   <nodes>       8080:30001/TCP   23s

可以访问一下这个端口

[[email protected] ~]# curl 10.254.31.188:8080

[[email protected] ~]# curl 10.254.105.128:8080
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>Apache Tomcat/8.0.35</title>
        <link href="favicon.ico" rel="icon" type="image/x-icon" />
        <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
        <link href="tomcat.css" rel="stylesheet" type="text/css" />
    </head>

    <body>
        <div id="wrapper">
            <div id="navigation" class="curved container">
                <span id="nav-home"><a href="http://tomcat.apache.org/">Home</a></span>
                <span id="nav-hosts"><a href="/docs/">Documentation</a></span>
                <span id="nav-config"><a href="/docs/config/">Configuration</a></span>
                <span id="nav-examples"><a href="/examples/">Examples</a></span>
                <span id="nav-wiki"><a href="http://wiki.apache.org/tomcat/FrontPage">Wiki</a></span>
                <span id="nav-lists"><a href="http://tomcat.apache.org/lists.html">Mailing Lists</a></span>
                <span id="nav-help"><a href="http://tomcat.apache.org/findhelp.html">Find Help</a></span>
                <br />

在访问一下30001端口,因为配置文件设置了nodPort,所以可以直接本机ip加端口访问

[[email protected] ~]# curl 192.168.18.132:30001/demo/

[[email protected] ~]# curl 192.168.18.132:30001/demo/

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>HPE University Docker&Kubernetes Learning</title>
</head>
<body  align="center">

	
      <h2>Congratulations!!</h2>
     <br></br>
	 <input type="button" value="Add..." onclick="location.href='input.html'" >
	     <br></br>
      <TABLE align="center"  border="1" width="600px">
   <TR>
      <TD>Name</TD>
      <TD>Level(Score)</TD>
   </TR>

      
 <TR>
      <TD>google</TD>
      <TD>100</TD>
   </TR>

 <TR>
      <TD>docker</TD>
      <TD>100</TD>
   </TR>

 <TR>
      <TD>teacher</TD>
      <TD>100</TD>
   </TR>

 <TR>
      <TD>HPE</TD>
      <TD>100</TD>
   </TR>

 <TR>
      <TD>our team</TD>
      <TD>100</TD>
   </TR>

 <TR>
      <TD>me</TD>
      <TD>100</TD>
   </TR>

  </TABLE>
      
</body>
</html>

浏览器页面访问

先加一个防火墙规则iptables -P FORWARD ACCEPT

http://192.168.18.132:30001/demo/

kubernetes1

创建

kubernetes1

你会发现多了一个用户

kubernetes1

查看数据库

[[email protected] ~]# !mysql
mysql -u root -p123456 -h10.254.90.103
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.6.49 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| HPE_APP            |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.01 sec)

MySQL [(none)]> use HPE_APP;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [HPE_APP]> show tables;
+-------------------+
| Tables_in_HPE_APP |
+-------------------+
| T_USERS           |
+-------------------+
1 row in set (0.00 sec)

MySQL [HPE_APP]> select * from T_USERS;
+----+-----------+-------+
| ID | USER_NAME | LEVEL |
+----+-----------+-------+
|  1 | me        | 100   |
|  2 | our team  | 100   |
|  3 | HPE       | 100   |
|  4 | teacher   | 100   |
|  5 | docker    | 100   |
|  6 | google    | 100   |
|  7 | awei      | 100   |
+----+-----------+-------+
7 rows in set (0.00 sec)

MySQL [HPE_APP]>

kubectl命令

kubectl create -f 文件名 ##创建一个

kubectl get svc ##查看所有的service

kubectl get pod ##查看所有的pod

kubectl get rc ##查看所有的rc

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号