k8s

kubernetes介绍

Posted by Kaka Blog on November 27, 2020

概述

Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用。

核心组件

  • etcd保存了整个集群的状态;
  • apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
  • controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
  • scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
  • kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
  • Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);
  • kube-proxy负责为Service提供cluster内部的服务发现和负载均衡;

一些概念

Pod

Pod是在K8s集群中运行部署应用或服务的最小单元,可以看作运行在K8s集群中的小机器人,不同类型的业务就需要不同类型的小机器人去执行。目前K8s中的业务主要可以分为长期伺服型(long-running)、批处理型(batch)、节点后台支撑型(node-daemon)和有状态应用型(stateful application);分别对应的小机器人控制器为Deployment、Job、DaemonSet和PetSet。

复制控制器(Replication Controller,RC)

通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。指定的数目可以是多个也可以是1个;少于指定数目,RC就会启动运行新的Pod副本;多于指定数目,RC就会杀死多余的Pod副本。

副本集(Replica Set,RS)

RS是新一代RC,提供同样的高可用能力,区别主要在于RS后来居上,能支持更多种类的匹配模式。副本集对象一般不单独使用,而是作为Deployment的理想状态参数使用。

部署(Deployment)

部署表示用户对K8s集群的一次更新操作。部署是一个比RS应用模式更广的API对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新RS中副本数增加到理想状态,将旧RS中的副本数减小到0的复合操作;这样一个复合操作用一个RS是不太好描述的,所以用一个更通用的Deployment来描述。以K8s的发展方向,未来对所有长期伺服型的的业务的管理,都会通过Deployment来管理。

服务(Service)

在K8s集群中,客户端需要访问的服务就是Service对象。每个Service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。在K8s集群中微服务的负载均衡是由Kube-proxy实现的。Kube-proxy是K8s集群内部的负载均衡器。它是一个分布式代理服务器,在K8s的每个节点上都有一个。

节点(Node)

K8s集群中的Node也就等同于Mesos集群中的Slave节点,是所有Pod运行所在的工作主机。

密钥对象(Secret)

Secret是用来保存和传递密码、密钥、认证凭证这些敏感信息的对象。

用户帐户(User Account)和服务帐户(Service Account)

用户帐户为人提供账户标识,而服务账户为计算机进程和K8s集群中运行的Pod提供账户标识。用户帐户和服务帐户的一个区别是作用范围;用户帐户对应的是人的身份,人的身份与服务的namespace无关,所以用户账户是跨namespace的;而服务帐户对应的是一个运行中程序的身份,与特定namespace是相关的。

名字空间(Namespace)

名字空间为K8s集群提供虚拟的隔离作用,K8s集群初始有两个名字空间,分别是默认名字空间default和系统名字空间kube-system,除此以外,管理员可以可以创建新的名字空间满足需要。

常用命令

  • kubectl version 输出服务端和客户端的版本信息。
wj@master:~$ kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.4", GitCommit:"d360454c9bcd1634cf4cc52d1867af5491dc9c5f
", GitTreeState:"clean", BuildDate:"2020-11-11T13:17:17Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"}Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.4", GitCommit:"d360454c9bcd1634cf4cc52d1867af5491dc9c5f
", GitTreeState:"clean", BuildDate:"2020-11-11T13:09:17Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"}fwj@master:~$ kubectl get version
  • kubectl cluster-info 输出集群信息。
fwj@master:~$ kubectl cluster-info
Kubernetes master is running at https://192.168.241.160:6443
KubeDNS is running at https://192.168.241.160:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
  • kubectl get 资源名 [-n 命名空间]/[-A] 输出一个/多个资源。
fwj@master:~$ kubectl get nodes
NAME     STATUS     ROLES    AGE     VERSION
master   Ready      master   2d23h   v1.19.4
slave    NotReady   <none>   2d20h   v1.19.4

fwj@master:~$ kubectl get services
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          2d23h
myweb        NodePort    10.108.222.188   <none>        8080:30001/TCP   2d17h

fwj@master:~/working$ kubectl get rc
NAME    DESIRED   CURRENT   READY   AGE
mysql   1         1         1       2d21h
myweb   3         3         3       2d17h

fwj@master:~$ kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE             ERROR
etcd-0               Healthy   {"health":"true"}   
controller-manager   Healthy   ok                  
scheduler            Healthy   ok

fwj@master:~$ kubectl get secrets
NAME                       TYPE                                  DATA   AGE
def-ns-admin-token-95qmk   kubernetes.io/service-account-token   3      20h
default-token-hdb86        kubernetes.io/service-account-token   3      2d22h

fwj@master:~$ kubectl get pods
NAME          READY   STATUS        RESTARTS   AGE
mysql-2986g   0/1     Pending       0          63s
mysql-gc4j8   1/1     Terminating   1          2d20h
myweb-cx8f4   1/1     Terminating   1          2d17h
myweb-fn485   1/1     Terminating   1          2d17h
myweb-k8472   1/1     Terminating   1          2d17h
myweb-pcsbg   0/1     Pending       0          63s
myweb-twlsd   0/1     Pending       0          62s
myweb-wzddp   0/1     Pending       0          62s
  • kubectl logs 输出pod中一个容器的日志。
fwj@master:~$ kubectl logs kube-apiserver-master -n kube-system
Flag --insecure-port has been deprecated, This flag will be removed in a future version.
I1127 06:25:31.814576       1 server.go:625] external host was not specified, using 192.168.241.160
······
  • kubectl describe [资源类型] [资源名称] – 输出指定的一个/多个资源的详细信息。
fwj@master:~$ kubectl describe pod mysql-2986g
Name:           mysql-2986g
Namespace:      default
Priority:       0
Node:           slave/192.168.241.161
······
  • kubectl api-versions – 以“组/版本”的格式输出服务端支持的API版本
fwj@master:~/working$ kubectl api-versions
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1
coordination.k8s.io/v1beta1
discovery.k8s.io/v1beta1
events.k8s.io/v1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
networking.k8s.io/v1beta1
node.k8s.io/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1
  • kubectl exec 进入容器
fwj@master:~/working$ kubectl exec -it myweb-pcsbg bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] inste
ad.root@myweb-pcsbg:/usr/local/tomcat# 
  • kubectl create – 通过文件名或控制台输入,创建资源。
  • kubectl delete – 通过文件名、控制台输入、资源名或者label selector删除资源。
  • kubectl apply – 通过文件名或控制台输入,对资源进行配置。
  • kubectl proxy – 为Kubernetes API server启动代理服务器。

YAML配置文件

YAML是一个JSON的超集,意味着任何有效JSON文件也都是一个有效的YAML文件。YAML只有两种结构类型你需要知道:

  • Lists:项的定义以破折号(-)开头,并且与父元素之间存在缩进。
  • Maps
apiVersion: v1
kind: Pod
metadata:
  name: rss-site
  labels:
    app: web
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80
    - name: rss-reader
      image: nickchase/rss-php-nginx:v1
      ports:
        - containerPort: 88

等价于:

{
   "apiVersion": "v1",
   "kind": "Pod",
   "metadata": {
                 "name": "rss-site",
                 "labels": {
                             "app": "web"
                           }
               },
    "spec": {
       "containers": [{
                       "name": "front-end",
                       "image": "nginx",
                       "ports": [{
                                  "containerPort": "80"
                                 }]
                      }, 
                      {
                       "name": "rss-reader",
                       "image": "nickchase/rss-php-nginx:v1",
                       "ports": [{
                                  "containerPort": "88"
                                 }]
                      }]
            }
}

使用YAML创建RC

apiVersion: v1
kind: ReplicationController                           
metadata:
  name: myweb                                          
spec:
  replicas: 3                                          #Pod副本的期待数量
  selector:
    app: myweb                                         #符合目标的Pod拥有此标签
  template:                                            #根据此模板创建Pod的副本(实例)
    metadata:
      labels:
        app: myweb                                     #Pod副本拥有的标签,对应RC的Selector
    spec:
      containers:                                      #Pod内容器的定义部分
      - name: myweb                                    #容器的名称
        image: hub.c.163.com/library/tomcat:latest              #容器对应的Docker image
        ports: 
        - containerPort: 8080                          #容器应用监听的端口号
        env:                                           #注入容器内的环境变量
        - name: MYSQL_SERVICE_HOST 
          value: "mysql"
        - name: MYSQL_SERVICE_PORT
          value: "3306"

使用YAML创建Service

apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30001
  selector:
    app: myweb

参考资料