k8s介绍

k8s搭建一个应用(mysql+tomcat)

kubetnetes介绍

官网 https://kubernetes.io/

Kubernetes也就是k8s

Kubernetes是一个开源系统,它主要用来自动部署、扩容缩容和管理容器应用。

它将诸多应用的容器分为若干个逻辑单元以便于管理和发现。Kubernetes拥有着在kubernetes中,service是核心,我们并不需要太多关注kubernetes里面是怎么工作的,我们只需要关心它给我们提供什么service。

就像docker容器可以提供一个mysqld的服务、web服务等。

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

提供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内的业务容器之间的通信和数据交换更为高效。

在集群管理方面,kubernetes将集群中的机器划分为一个master节点和一群工作节点Node,其中master上运行着kubeapiserver、kube-controller-manager、kube-scheduler,它们实现了资源管理、pod调度、弹性伸缩、安全控制、系统监

控、纠错等功能。Node是工作节点,运行应用程序,提供服务。Node上的最小单元是pod,Node上运行着kubernetesd的kubelet、kube-proxy服务进程,它们负责pod的创建、启动、监控、重启、销毁,以及实现负载均衡。

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

Google高负载生产环境的15年经验,并结合了社区的优秀思想和实践。

扩容和升级需要一个关键的东西,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上启动并运行。

可理解为pod的高可用,是rc来定义的(调度的)。可调度到其他正常的node上

该过程完全自动化,无需人工干涉。

从一个例子开始:

webapp(tomcat) + mysql

安装kubernetes #此处只是单机安装kubernetes,并不是安装集群

准备一台centos7.5以上的版本

#cat /etc/redhat-release 来看一下版本。如果不是 yum update升级一下

1) 关闭firewalld 和 selinux

systemctl stop firewalld

systemctl disable firewalld

setenforce 0

2)安装etcd和kubernetes

yum install -y etcd kubernetes

#etcd是用来存储kubernetes里的集群文件的(存配置文件配置的数据库)

错误:docker-ce conflicts with 2:docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64
错误:docker-ce-cli conflicts with 2:docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64

#安装的时候报错,与docker相关的冲突。分别删除提示的那两个docker相关的:

yum remove -y docker-ce.x86_64 0:18.03.0.ce-1.el7.centos

yum remove -y docker-ce*

3)修改配置文件

vi /etc/sysconfig/docker

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

vi /etc/kubernetes/apiserver

把--admission_control参数中的ServiceAccount删除

4)准备工作

yum install python-rhsm-certificates

Package python-rhsm-certificates-1.19.10-1.el7_4.x86_64 is obsoleted by subscription-manager-rhsm-certificates-1.21.10-3.el7.centos.x86_64 which is already installed

如果提示python-rhsm-certificates-1.19.10-1.el7_4.x86_64 被已安装的 subscription-manager-rhsm-certificates-

1.20.11-1.el7.centos.x86_64 取代,就要执行下面两步骤:

wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm

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

配置docker加速器

vi /etc/docker/daemon.json//加入如下内容

{

"registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]

}

5)按顺序启动所有服务

for s in etcd docker kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy

do

systemctl start $s

done

6)创建一个rc文件

vim mysql-rc.yaml #内容如下 #需注意空格

apiVersion: v1
kind: ReplicationController
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.6
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"

apiVersion: v1

kind: ReplicationController #副本控制器RC

metadata:

name: mysql #RC的名称,全局唯一

spec:

replicas: 1 #Pod副本的期待数量,如果这为10,那么最终他们形成了一个service

selector:

app: mysql #符合目标的Pod拥有此标签

template: #根据此模板创建Pod的副本(实例)

metadata:

labels:

app: mysql #Pod副本拥有的标签,对应RC的Selector

spec:

containers: #Pod内容器的定义部分

- name: mysql #容器的名称

image: mysql:5.6 #容器对应的Docker image。此处因为这个实验太老了,所以加了个5.6版本的

ports:

- containerPort: 3306 #容器应用监听的端口号

env: #注入容器内的环境变量

- name: MYSQL_ROOT_PASSWORD

value: "123456"

·················rc文件内容到此结束·································

docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest #不用执行这两步会自动拉取镜像。这两部如果手动执行,下面一步创建(create)之后,就会直接Running了。就不用等了

Trying to pull repository registry.access.redhat.com/rhel7/pod-infrastructure ...
latest: Pulling from registry.access.redhat.com/rhel7/pod-infrastructure
26e5ed6899db: Already exists
66dbe984a319: Already exists
9138e7863e08: Already exists
Digest: sha256:92d43c37297da3ab187fc2b9e9ebfb243c1110d446c783ae1b989088495db931
Status: Image is up to date for registry.access.redhat.com/rhel7/pod-infrastructure:latest

docker pull mysql:5.6

Trying to pull repository docker.io/library/mysql ...
5.6: Pulling from docker.io/library/mysql
Digest: sha256:e4a70c0f52bfda9ed28d2127b461ff44cbc381450e7ca22e83936560d8875f14
Status: Image is up to date for docker.io/mysql:5.6

kubectl create -f mysql-rc.yaml #上一步定义好rc文件,就可以去创建rc了

service "mysql" created

提示以下错误,检查vim mysql-rc.yaml配置注意空格。

error: error validating "mysql-rc.yaml": 
replicationcontroller "mysql" created

kubectl get rc #可查看rc都有哪些。就是把所有的rc都get出来

[root@axinlinux-03 ~]# kubectl get rc

NAME      DESIRED   CURRENT   READY     AGE
mysql     1         1         0         2m

NAME DESIRED CURRENT READY AGE

mysql 1 1 1 2m #拉取完之后,get rc的时候会显示这个

kubectl get pods #通过pod看他的状态。就是把所有的pod都get出来

[root@axinlinux-03 ~]# kubectl get pod

NAME          READY     STATUS    RESTARTS   AGE
mysql-qk4fc   0/1       Pending   0          3m

NAME READY STATUS RESTARTS AGE

mysql-qk4fc 0/1 Running 0 3m #状态为Running的时候就代表可以了

7)创建一个svc文件

vim mysql-svc.yaml #注意空格

apiVersion: v1

kind: Service

metadata:

name: mysql

spec:

ports:

- port: 3306

selector:

app: mysql

·················svc文件内容到此结束·································

kubectl create -f mysql-svc.yaml

service "mysql" created

kubectl get svc #下面会出现mysql

[root@axinlinux-03 ~]# kubectl get svc

NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE

kubernetes 10.254.0.1 <none> 443/TCP 22m

mysql 10.254.215.180 <none> 3306/TCP 15s #这个ip就是sercice的ip,通过这个ip和prot就可以访问这个mysql了

mysql -uroot -p123456 -h10.254.215.180 #可登陆mysql

8)创建web rc文件

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.215.180' #这里的IP需要通过kubect get svc 查看mysql的cluster ip

- name: MYSQL_SERVICE_PORT

value: '3306'

·················web文件内容到此结束·································

kubectl create -f web-rc.yaml

9)创建web svc文件

vim web-svc.yamly

kind: Service

metadata:

name: myweb

spec:

type: NodePort

ports:

- port: 8080

nodePort: 30001 #意思是在ens33的ip上去访问mysql服务,所以指定一个监听端口(因为上面的mysql不是要用哪个指定的ip去访问吗),这个端口最低不能超过30000

selector:

app: myweb

·················web文件内容到此结束·································

kubectl create -f web-svc.yaml #创建之前get pod查看是否已启动

10)访问

iptables -P FORWARD ACCEPT #把forward规则打开

curl 本机ip:30001/demo/ 或浏览器

以上,可以点击add去增加一行数据

去mysql看看有没有这行数据:

mysql -uroot -p123456 -h10.254.215.180

show databases;

use HPE_APP

show tables;

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 | axin | 100 | #这就是刚刚在浏览器界面加的一行数据

+----+-----------+-------+

问题

https://blog.csdn.net/gezilan/article/details/80011905

https://www.cnblogs.com/neutronman/p/8047547.html

https://blog.csdn.net/d7185540/article/details/80868816

总结:

kebuctl create -f XXX #-f后面跟的是文件名。可以通过rc文件创建rc,通过service(svc)文件创建一个service(svc)

kebuctl get pod #查看所有的pod

kubectl get svc #查看所有的sercive

kubectl get rc #查看所的rc

 
 
07-04 23:38