首页 > Web开发 > 详细

linux运维、架构之路-Kubernetes基础(一)

时间:2019-11-08 01:15:01      阅读:100      评论:0      收藏:0      [点我收藏+]

一、Kubernetes介绍

       Kubernetes最初源于谷歌内部的Borg,提供了面向应用的容器集群部署和管理系统。Kubernetes的目标旨在消除编排物理/虚拟计算,网络和存储基础设施的负担,并使应用程序运营商和开发人员完全将重点放在以容器为中心进行自助运营。Kubernetes 也提供稳定、兼容的基础(平台),用于构建定制化的workflows 和更高级的自动化任务。 Kubernetes 具备完善的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建负载均衡器、故障发现和自我修复能力、服务滚动升级和在线扩容、可扩展的资源自动调度机制、多粒度的资源配额管理能力。 Kubernetes 还提供完善的管理工具,涵盖开发、部署测试、运维监控等各个环节。kubernetes是一个全新的基于容器技术的分布式架构解决方案,并且是一个一站式的完备的分布式系统开发和支撑平台。Kubernetes作为云原生应用的基石,相当于一个云操作系统,其重要性不言而喻。

1、Kubernetes架构图

技术分享图片

 2、Kubernetes主要核心组件介绍

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

二、Kubernetes基础服务

1、Pod介绍

技术分享图片

         每个Pod都有一个特殊的被称为“根容器”Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,Pause作为Pod根容器,它的状态代表整个容器组的状态。除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器,Pod里的多个业务容器共享Pause容器的IP,共享Pause容器挂载的Volume。

       Kubernetes为每个Pod分配唯一的IP的地址,称之为Pod IP,一个Pod里的多个容器共享Pod IP。Kubernetes要求底层网络支持集群内任意两个Pod之间的TCP/IP的直接通讯,采用虚拟二层网络技术来实现,一个Pod里的容器与另外主机上的Pod容器能够直接通信。

       Pod一旦被创建,就会被放入到etcd中存储,随后会被Kubernetes Master调度到某个具体的Node上并进行绑定(Binding),随后该Pod 被对应的Node上的kubelet进程实例化成一组相关的docker容器运行起来。当Pod里的某个容器停止时,Kubernetes会自动检测到这个问题并且重新启动这个Pod (也就是重启Pod里的所有容器),如果Pod所在的Node节点宕机,则会将这个Node上所偶的Pod从新调度到其他Node节点上。

①Endpoint

         Pod的IP加上这里的容器端口(container Port),就组成了一个全新的概念---Endpoint 它代表着此Pod里的一个服务进程的对外通讯地址。一个Pod也存在着多个Endpoint的情况,比如我们把Tomcat定义为一个Pod时,可以对外暴露端口与服务端口这两个Endpoint。

②Event

        Event是一个事件的记录,记录事件的最早生成时间、最后重现时间、重复次数、发起者、类型,以及导致此事件的原因等众多信息。Event通常会关联到某个具体的资源上,是排查故障的重要参考,Node描述信息包含了Event,而Pod同样有Event记录。当我们发现某个Pod迟迟无法创建时,我们就可以用kubectl describe pod [Pod名称]来查看,定位问题。

2、Pod基本用法

①Pod创建一个容器

###创建一个名为nginx-deployment的Pod###
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx   ##容器名称
        image: daocloud.io/library/nginx:1.13.0-alpine  #镜像地址
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

②Pod创建两个容器

###nginx和tomcat容器组合成一个整体对外提供服务时,应将这两个容器打包为一个Pod###
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: demon-pod
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      labels:
        app: test
    spec:
      containers:
      - name: demon-nginx-docker
        image: daocloud.io/library/nginx:1.13.0-alpine
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
      - name: demon-tomcat-docker
        image: daocloud.io/library/tomcat:8.5.21-jre8-alpine
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

查看Pod运行状态

kubectl get pod -o wide
NAME                         READY     STATUS    RESTARTS   AGE       IP         NODE
demon-pod-77857c4f5f-nrgnh   2/2       Running   0          40s       10.2.1.5   192.168.29.176

我们可以看到READY信息为2/2,表示Pod中的两个容器都成功运行了 (状态Running)

查看创建的Pod详细信息:

kubectl describe pod demon-pod-77857c4f5f-nrgnh
Name:           demon-pod-77857c4f5f-nrgnh
Namespace:      default
Node:           192.168.29.176/192.168.29.176
Start Time:     Thu, 07 Nov 2019 22:43:10 +0800
Labels:         app=test
                pod-template-hash=3341370919
Annotations:    <none>
Status:         Running
IP:             10.2.1.5
Controlled By:  ReplicaSet/demon-pod-77857c4f5f
Containers:
.....

3、Pod的配置管理ConfigMap

       应用部署的一个最佳实践是将应用所需的配置文件信息与程序进行分离,这样可以使得应用程序被更好地复用,通过不同的配置也能实现灵活的功能。将应用打包为容器镜像后,可以通过环境变量或者外挂文件的方式在创建容器时进行配置注入,但在大规模容器集群中,对多个容器进行不同的配置将变得非常复杂。从kubernetes1.2开始提供了一套应用配置管理方案----ConfigMap(资源对象)。

①ConfigMap用法:

  • 生成容器内的环境变量
  • 设置容器的启动命令的启动参数 (需要设置为环境变量)
  • 以Volume的形式挂载为容器内部的文件或目录

②创建ConfigMap方式

  • 通过直接在命令行中指定configmap参数创建,即--from-literal
  • 通过指定文件创建,即将一个配置文件创建为一个ConfigMap--from-file=<文件>
  • 通过指定目录创建,即将一个目录下的所有配置文件创建为一个ConfigMap,--from-file=<目录>
  • 事先写好标准的configmap的yaml文件,然后kubectl create -f 创建

使用yaml文件创建ConfigMap

###cat configmap-test.yaml###
apiVersion: v1
kind: ConfigMap
metadata:
  name: test-configmap
data:
  key1: demon
  keydir: /var/data

# name: configmap名称
# data.key1: key1 对应的值
# data.keydir: keydir对应的挂载目录

创建后查看

kubectl get configmaps
NAME             DATA      AGE
test-configmap   2         5s
# 这里我们可以看到创建了2个data的数据,就是我们上面定义的

查看创建configmaps详细信息:

kubectl describe configmaps test-configmap
Name:         test-configmap
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
key1:
----
demon
keydir:
----
/var/data
Events:  <none>

使用--from-file参数创建ConfigMap

###当前目录下含有配置文件server.xml,可以创建一个包含该文件内容的ConfigMap###
kubectl create configmap test-server.xml --from-file=server.xml

使用--from-literal创建ConfigMap

kubectl create configmap test-configmap --from-literal=loglevel=info --from-literal=appdatadir=/var/data

4、Pod中使用ConfigMap

①通过环境变量方式使用ConfigMap

###创建ConfigMap###
cat configmap-test.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: demon-configmap
data:
  keyinfo: www.demon.com
  abcdockerDir: /var/data

kubectl create -f configmap-test-1.yaml
###创建pod进行引用###
cat configmap-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: demon-pod
spec:
  containers:
    - name: configmap-pod
      image: busybox
      command: [ "/bin/sh", "-c", "env | grep config" ]
      env:
        - name: configmapPod
          valueFrom:
            configMapKeyRef:
              name: demon-configmap
              key: keyinfo
        - name: configmapDir
          valueFrom:
            configMapKeyRef:
              name: demon-configmap
              key: demonDir
  restartPolicy: Never

==================相关参数解释===================
      env:
        - name: configmapPod       ##定义环境变量名称
          valueFrom:               #key "keyinfo对应的值"
         configMapKeyRef:                     
name: demon
-configmap ##环境变量的值取自哪(上面创建的configmap名称) key: keyinfo #configmap里对应的key - name: configmapDir valueFrom: configMapKeyRef: name: demon-configmap key: demonDir ================================================== kubectl create -f configmap-pod.yaml

查看所有Pod

kubectl get pod --show-all

从kubernetes1.6开始,引用了一个新的字段envFrom实现Pod环境内将ConfigMap中所有定义的key=value自动生成为环境变量

cat configmap-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: demon-pod
spec:
  containers:
    - name: configmap-pod
      image: busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
      - configMapRef:
          name: demon-configmap  ##根据configmap中自动生成key=value环境变量
  restartPolicy: Never

通过这个定义,在容器内部将会自动生成如下环境配置

 ②通过volumeMount使用ConfigMap创建ConfigMap

###创建ConfigMap###

技术分享图片
###创建ConfigMap###

cat configmap-tomcat-server.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: tomcat-server-config
data:
  server.xml: |
    <?xml version=1.0 encoding=utf-8?>
      <Server port="8005" shutdown="SHUTDOWN">
      <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
      <!--APR library loader. Documentation at /docs/apr.html -->
      <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
      <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
      <Listener className="org.apache.catalina.core.JasperListener" />
      <!-- Prevent memory leaks due to use of particular java/javax APIs-->
      <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
      <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
      <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
      <GlobalNamingResources>
        <Resource name="UserDatabase" auth="Container"
                  type="org.apache.catalina.UserDatabase"
                  description="User database that can be updated and saved"
                  factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
                  pathname="conf/tomcat-users.xml" />
      </GlobalNamingResources>
      <Service name="Catalina">
        <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
            maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true" />
        <Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
                   connectionTimeout="20000"
                   redirectPort="8443"
                   enableLookups="false"
                   maxPostSize="10485760"
                   URIEncoding="UTF-8"
                   disableUploadTimeout="true"
                   maxConnections="10000"
                   SSLEnabled="false"/>
        <Engine name="Catalina" defaultHost="localhost">
          <Realm className="org.apache.catalina.realm.LockOutRealm">
            <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                   resourceName="UserDatabase"/>
          </Realm>
          <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="localhost_access_log." suffix=".txt"
                   pattern="%h %l %u %t &quot;%r&quot; %s %b" />
          </Host>
          <Context path="" docBase="/tomcat/webapps" debug="0" reloadable="true" crossContext="true"/>
        </Engine>
       </Service>
     </Server>


查看
[root@master configmap]# kubectl get configmaps tomcat-server-config
NAME                   DATA      AGE
tomcat-server-config   1         13s

查看详细信息
[root@master configmap]# kubectl describe configmaps tomcat-server-config
Name:         tomcat-server-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
server.xml:
----
<?xml version=1.0 encoding=utf-8?>
  <Server port="8005" shutdown="SHUTDOWN">
  <Listener 
.....
View Code

###引用ConfigMap###

技术分享图片
cat test.yaml

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: abcdocker-pod
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - image: busybox
        imagePullPolicy: IfNotPresent
        name: tomcatpod
        volumeMounts:
        - mountPath: /tmp/server.xml
          name: serverxml
          subPath: server.xml
        ports:
        - containerPort: 8080
        command: ["tail", "-f", "/dev/null"]
      volumes:
      - name: serverxml
        configMap:
          name: tomcat-server-config
          items:
          - key: server.xml
            path: server.xml

kubectl create -f test.yaml        
===================参数解释===============
        volumeMounts:
        - mountPath: /tmp/server.xml  ##挂在到容器内的目录
          name: serverxml     #挂载名称(需要和volume的名称对应上)
          subPath: server.xml   #不加subPath会替换整个目录
        ports:
        - containerPort: 8080
        command: ["tail", "-f", "/dev/null"]
      volumes:
      - name: serverxml         #volumemount名称
        configMap:
          name: tomcat-server-config   #创建的configmap名称
          items:
          - key: server.xml     #对应的key
            path: server.xml    #挂载到目录的key名称
####################################

需要注意的是,不可以光mount挂载,需要执行命令让容器在前台运行!
View Code

验证:登陆容器可以在tmp目录下看到我们的server.xml

5、ConfigMap的限制条件如下

  • ConfigMap必须在Pod之前创建
  • ConfigMap受Namespace限制,只有处于相同Namespace中的Pod可以引用它
  • ConfigMap中的配额管理还未能实现
  • Kubelet只可以支持可以被API Server管理的Pod使用ConfigMap。kubelet在本Node上通过 --manifest-url或--config自动创建的静态Pod将无法引用ConfigMap
  • 在Pod对ConfigMap进行挂载volumeMount操作时,容器内部职能挂载"目录",无法挂载为文件。在挂载到容器内部后,目录中将包含ConfigMap定义的每个item,如果该目录下原来还有其他文件,则容器内的该目录将会被挂载的ConfigMap覆盖。如果应用程序需要保留原来的其他文件,则需要进行额外的处理。可以将ConfigMap挂载到容器内部的临时目录,再通过启动脚本将配置文件复制或者链接到(cp link)应用所用的实际配置目录下
  • 需要注意的是,容器不可以光mount挂载,需要执行命令让容器在前台运行!
  • 需要在挂载下面添加subPath,否则将会替换整个目录

 

linux运维、架构之路-Kubernetes基础(一)

原文:https://www.cnblogs.com/yanxinjiang/p/11816948.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!