001 - kubernetes 介绍

lance 2020-03-20 PM 9℃ 0条

简介

官网: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 各个元素的关系

30810-pvvevf4o7f.png
90504-87umevquu7r.png
58282-jngz99hqt4.png
56293-jfd7dpqscp.png


扩容和升级例子

扩容和升级需要一个关键的东西,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

浏览器访问
34719-sqti0rguk8.png


标签: linux, kubernetes, k8s

非特殊说明,本博所有文章均为博主原创。

评论啦~