简介
官网:https://kubernetes.io/
Kubernetes 也就是 k8s
Kubernetes 是一个开源系统,它主要用来自动部署、扩容缩容和管理容器应用。它将诸多应用的容器分为若干个逻辑单元以便于管理和发现。Kubernetes 拥有着 Google 高负载生产环境的15年经验,并结合了社区的优秀思想和实践。
在 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 各个元素的关系
扩容和升级例子
扩容和升级需要一个关键的东西,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 上启动并运行。该过程完全自动化,无需人工干涉。
从一个例子开始:
webapp + mysql
安装kubernetes:
准备一台 centos7
1) 关闭 firewalld 和 selinux
systemctl stop firewalld && systemctl disable firewalld && setenforce 0
2)安装 etcd 和 kubernetes
yum install -y etcd kubernetes
3)修改配置文件
vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
改为
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io --log-driver=journald --signature-verification=false'
vim /etc/kubernetes/apiserver
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
改为
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
4)准备工作
yum install python-rhsm-certificates
如提示:
软件包 python-rhsm-certificates-1.19.10-1.el7_4.x86_64 被已安装的 subscription-manager-rhsm-certificates-1.24.13-3.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 加速器:
vim /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 #副本控制器 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"
docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
docker pull mysql:5.6
kubectl create -f mysql-rc.yaml
kubectl get rc
kubectl get pods
7)创建一个 svc 文件
vim mysql-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
kubectl create -f mysql-svc.yaml
kubectl get svc
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.73.107' #这里的 IP 需要通过 kubect get svc 查看 mysql 的 cluster ip
- name: MYSQL_SERVICE_PORT
value: '3306'
kubectl create -f web-rc.yaml
9)创建web svc文件
vim web-svc.yaml
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30001
selector:
app: myweb
kubectl create -f web-svc.yaml
10)访问
iptables -P FORWARD ACCEPT
浏览器访问