29.1 认识kubernetes
29.2 从一个例子开始
29.1 认识kubernetes
kubernetes
是一个管理容器的框架
。kubernetes是一个开源系统,用于自动化容器化应用程序的部署,扩展和管理。 它也简称为k8s 官网 https://kubernetes.io/zh/
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的创建、启动、监控、重启、销毁,以及实现负载均衡。
逻辑上
物理上
参考视频 https://www.bilibili.com/video/av10087636?from=search&seid=17893188254197971495
29.2 从一个例子开始
- pod扩容和升级需要一个关键的东西,Replication controller(RC),RC需要包含3个关键信息:
- 目标pod的定义
- 目标pod需要运行的副本数量(replicas)
- 要监控的目标pod的标签(Label)
工作过程:RC里定义好3个指标,kubernetes会根据RC定义的Label帅选出对应的pod,并实时监控其状态和数量,当实例数量 少于定义的副本数(replicas),则会根据RC定义的pod模版来创建新的pod,然后将此pod调度到合适的Node上启动并运行。 该过程完全自动化,无需人工干涉。
在单台机器上安装kubernetes 并安装管理mysql容器和webapp容器。
查看文章 https://www.cnblogs.com/neutronman/p/8047547.html
为了顺利安装kubernetes 先把系统升级到最新版本,并且让机器使用3G内存
1 2 3 4 5 |
[root@kun05 ~]# cat /etc/redhat-release ##查看当前系统版本 CentOS Linux release 7.4.1708 (Core) [root@kun05 ~]# yum -y update ##升级所有软件和系统 [root@kun05 ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) |
1.先关闭selinux和firewall
1 2 3 |
[root@kun05 ~]# systemctl stop firewalld [root@kun05 ~]# systemctl disable firewalld [root@kun05 ~]# setenforce 0 |
2.安装和etcdkubernetes (安装过程中会自动安装Docker软件)
1 |
[root@kun05 ~]# yum install -y etcd kubernetes |
etcd
是用来存储配置文件
的数据库,这里用来存储k8s的配置文件,它也是分布式的
3.修改配置文件
1 |
[root@kun05 ~]# vim /etc/sysconfig/docker |
将--selinux-enabled
改为 --selinux-enabled=false --insecure-registry gcr.io
1 |
--selinux-enabled=false --insecure-registry gcr.io |
1 |
[root@kun05 ~]# vim /etc/kubernetes/apiserver |
把--admission_control
参数中的ServiceAccount
删除
4.配置docker加速器
1 2 3 4 5 |
[root@kun05 ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"] } |
5.分别启动服务
1 2 3 4 5 6 7 |
[root@kun05 ~]# systemctl start etcd [root@kun05 ~]# systemctl start docker [root@kun05 ~]# systemctl start kube-apiserver [root@kun05 ~]# systemctl start kube-controller-manager [root@kun05 ~]# systemctl start kube-scheduler [root@kun05 ~]# systemctl start kubelet [root@kun05 ~]# systemctl start kube-proxy |
也可以使用for循环启动
1 |
for s in etcd docker kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy; do systemctl start $s; done |
6.定义一个mysql的rc文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[root@kun05 ~]# 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: hub.c.163.com/library/mysql #容器对应的Docker image ports: - containerPort: 3306 #容器应用监听的端口号 env: #注入容器内的环境变量 - name: MYSQL_ROOT_PASSWORD value: "123456" #密码 |
7.发布rc到集群上
1 2 |
[root@kun05 ~]# kubectl create -f mysql-rc.yaml 此时k8s就是去下载对应的image并启动容器 |
查看刚刚创建rc的状态
1 2 3 |
[root@kun05 ~]# kubectl get rc NAME DESIRED CURRENT READY AGE mysql 1 1 0 2m |
查看pod的创建情况
1 2 3 4 |
[root@kun05 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE mysql-32nvw 0/1 ContainerCreating 0 4m Pod的状态处于ContainerCreating,需要等到状态为Runing才算成功 |
问题 创建rc中pod状态处于ContainerCreating卡死
1 2 3 4 5 6 |
[root@kun05 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE mysql-32nvw 0/1 ContainerCreating 0 4m Error syncing pod 59950974-d84a-11e8-86ca-000c2971e1ca, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest\"" ` |
参考文档 https://blog.csdn.net/d7185540/article/details/80868816
https://blog.csdn.net/gezilan/article/details/80011905
解决 缺少python-rhsm-certificates
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[root@kun05 ~]# yum install python-rhsm-certificates 提示 软件包 python-rhsm-certificates-1.19.10-1.el7_4.x86_64 被已安装的 subscription-manager-rhsm-certificates-1.20.11-1.el7.centos.x86_64 取代 无须任何处理 [root@kun05 ~]# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm [root@kun05 ~]# 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@kun05 ~]# kubectl delete -f mysql-rc.yaml ##先删除刚才的rc再创建 [root@kun05 ~]# kubectl create -f mysql-rc.yaml [root@kun05 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE mysql-x4rwx 1/1 Running 0 8m |
Running表示已经启动为容器
8.定义一个mysql的svc/servce文件
1 2 3 4 5 6 7 8 9 10 11 |
[root@kun05 ~]# vim mysql-svc.yaml apiVersion: v1 kind: Service #表明是K8s Service metadata: name: mysql #Service的全局唯一名称 spec: ports: - port: 3306 #Service提供服务的端口号 selector: #Service对应的Pod拥有这里定义的标签 app: mysql |
9.发布service到集群上
1 2 3 4 5 6 |
[root@kun05 ~]# kubectl create -f mysql-svc.yaml [root@kun05 ~]# kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 52m mysql 10.254.75.46 <none> 3306/TCP 2m |
不同的service之间都是通过CLUSTER-IP来实现通讯的
10.定义一个webapp的rc文件并发布
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[root@kun05 ~]# vim web-rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: myweb spec: replicas: 1 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: docker.io/kubeguide/tomcat-app:v1 ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: "10.254.75.46" #这里的IP需要通过kubect get svc 查看mysql的cluster ip - name: MYSQL_SERVICE_PORT value: "3306" [root@kun05 ~]# kubectl create -f web-rc.yaml |
11.定义一个webapp的svc文件并发布
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[root@kun05 ~]# vim web-svc.yaml apiVersion: v1 kind: Service metadata: name: myweb spec: type: NodePort ports: - port: 8080 ##容器的端口 nodePort: 30001 ##映射到物理机的端口 selector: app: myweb [root@kun05 ~]# kubectl create -f web-svc.yaml [root@kun05 ~]# kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 2h mysql 10.254.75.46 <none> 3306/TCP 1h myweb 10.254.156.235 <nodes> 8080:30001/TCP 18s |
12.使用curl和浏览器测试
1 2 3 |
[root@kun05 ~]# iptables -P FORWARD ACCEPT [root@kun05 ~]# curl http://192.168.80.105:30001 -I |