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
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 3h
mysql 10.254.226.233 <none> 3306/TCP 2h
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 22m
mysql 10.254.226.233 <none> 3306/TCP 15s #这个ip就是sercice的ip,通过这个ip和prot就可以访问这个mysql了
mysql -uroot -p123456 -h10.254.226.233 #可登陆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.226.233'
- name: MYSQL_SERVICE_PORT
value: '3306'
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.226.233#这里的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
selector:
app: myweb
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.226.233
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
所有评论(0)