K8S学习--Kubeadm-5-资源管理核心概念

K8S学习–Kubeadm 安装 kubernetes-1-组件简介
K8S学习–Kubeadm 安装 kubernetes-2-安装部署
K8S学习–Kubeadm-3-dashboard部署和升级
K8S学习–Kubeadm-4-测试运行Nginx+Tomcat

1. k8s的设计理念—分层架构

http://docs.kubernetes.org.cn/251.html#Kubernetes架构

Kubernetes设计理念和功能其实就是一个类似Linux的分层架构,如下图所示
K8S学习--Kubeadm-5-资源管理核心概念_第1张图片

核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
应用层:部署(无状态应用(无集群关系)、有状态应用(数据库主从 Rredis集群)、批处理任务、集群应用等)和路由(服务发现、DNS解析等)。有状态应用一般是跑在物理机上面
管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
接口层:kubectl命令行工具、客户端SDK以及集群联邦
生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
1.Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
2.Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

2. k8s的设计理念—API设计原则

https://www.kubernetes.org.cn/kubernetes%e8%ae%be%e8%ae%a1%e7%90%86%e5%bf%b5
#API设计原则

所有API应该是声明式的。
•API对象是彼此互补而且可组合的。
•高层API以操作意图为基础设计。
•低层API根据高层API的控制需要设计。
•尽量避免简单封装,不要有在外部API无法显式知道的内部隐藏的机制。
•API操作复杂度与对象数量成正比。
•API对象状态不能依赖于网络连接状态。
•尽量避免让操作机制依赖于全局状态,因为在分布式系统中要保证全局状态的同步是非常困难的。

2.1Kubernetes设计理念与分布式系统

分析和理解Kubernetes的设计理念可以使我们更深入地了解Kubernetes系统,更好地利用它管理分布式部署的云原生应用,另一方面也可以让我们借鉴其在分布式系统设计方面的经验。

2.2 API设计原则

对于云计算系统,系统API实际上处于系统设计的统领地位,正如本文前面所说,K8s集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的API对象,支持对该功能的管理操作,理解掌握的API,就好比抓住了K8s系统的牛鼻子。K8s系统API的设计有以下几条原则:

1.所有API应该是声明式的。
正如前文所说,声明式的操作,相对于命令式操作,对于重复操作的效果是稳定的,这对于容易出现数据丢失或重复的分布式环境来说是很重要的。另外,声明式操作更容易被用户使用,可以使系统向用户隐藏实现的细节,隐藏实现的细节的同时,也就保留了系统未来持续优化的可能性。此外,声明式的API,同时隐含了所有的API对象都是名词性质的,例如Service、Volume这些API都是名词,这些名词描述了用户所期望得到的一个目标分布式对象。

2.API对象是彼此互补而且可组合的。
这里面实际是鼓励API对象尽量实现面向对象设计时的要求,即“高内聚,松耦合”,对业务相关的概念有一个合适的分解,提高分解出来的对象的可重用性。事实上,K8s这种分布式系统管理平台,也是一种业务系统,只不过它的业务就是调度和管理容器服务。

3.高层API以操作意图为基础设计。
如何能够设计好API,跟如何能用面向对象的方法设计好应用系统有相通的地方,高层设计一定是从业务出发,而不是过早的从技术实现出发。因此,针对K8s的高层API设计,一定是以K8s的业务为基础出发,也就是以系统调度管理容器的操作意图为基础设计。

4.低层API根据高层API的控制需要设计。
设计实现低层API的目的,是为了被高层API使用,考虑减少冗余、提高重用性的目的,低层API的设计也要以需求为基础,要尽量抵抗受技术实现影响的诱惑。

5.尽量避免简单封装,不要有在外部API无法显式知道的内部隐藏的机制。
简单的封装,实际没有提供新的功能,反而增加了对所封装API的依赖性。内部隐藏的机制也是非常不利于系统维护的设计方式,例如PetSet和ReplicaSet,本来就是两种Pod集合,那么K8s就用不同API对象来定义它们,而不会说只用同一个ReplicaSet,内部通过特殊的算法再来区分这个ReplicaSet是有状态的还是无状态。

6.API操作复杂度与对象数量成正比。
这一条主要是从系统性能角度考虑,要保证整个系统随着系统规模的扩大,性能不会迅速变慢到无法使用,那么最低的限定就是API的操作复杂度不能超过O(N),N是对象的数量,否则系统就不具备水平伸缩性了。

**7.API对象状态不能依赖于网络连接状态。**由于众所周知,在分布式环境下,网络连接断开是经常发生的事情,因此要保证API对象状态能应对网络的不稳定,API对象的状态就不能依赖于网络连接状态。本机可以访问。但是跨主机还是得依赖网络。kubeadm默认没有暴露 二进制安装的会暴露8080 监听在127.0.0.1 只要连接到本机即可访问API

8.尽量避免让操作机制依赖于全局状态,因为在分布式系统中要保证全局状态的同步是非常困难的。

API:对象 ----是K8S集群之的管理操作单元
K8S学习--Kubeadm-5-资源管理核心概念_第2张图片

K8S学习--Kubeadm-5-资源管理核心概念_第3张图片

3.k8s命令使用

K8S学习--Kubeadm-5-资源管理核心概念_第4张图片

3.1 kubectl 概述

https://kubernetes.io/zh/docs/reference/kubectl/overview/
#Kubectl 命令行接口

使用以下语法 kubectl 从终端窗口运行命令:

kubectl [command] [TYPE] [NAME] [flags]
其中 command、TYPE、NAME 和 flags 分别是:

command:指定要对一个或多个资源执行的操作,例如 create、get、describe、delete。

TYPE:指定资源类型。资源类型不区分大小写,可以指定单数、复数或缩写形式。例如,以下命令输出相同的结果:
  kubectl get pod 
  kubectl get pods 
  kubectl get po
root@master-1:~# kubectl get pod 
NAME                                 READY   STATUS    RESTARTS   AGE
net-test1-5fcc69db59-jz944           1/1     Running   1          2d16h
net-test1-5fcc69db59-wzlmg           1/1     Running   2          2d16h
net-test1-5fcc69db59-xthfd           1/1     Running   2          2d16h
nginx-deployment-574b87c764-9m59f    1/1     Running   1          34h
tomcat-deployment-7cd955f48c-lthk2   1/1     Running   1          34h
root@master-1:~# kubectl get pods
NAME                                 READY   STATUS    RESTARTS   AGE
net-test1-5fcc69db59-jz944           1/1     Running   1          2d16h
net-test1-5fcc69db59-wzlmg           1/1     Running   2          2d16h
net-test1-5fcc69db59-xthfd           1/1     Running   2          2d16h
nginx-deployment-574b87c764-9m59f    1/1     Running   1          34h
tomcat-deployment-7cd955f48c-lthk2   1/1     Running   1          34h
root@master-1:~# kubectl get po
NAME                                 READY   STATUS    RESTARTS   AGE
net-test1-5fcc69db59-jz944           1/1     Running   1          2d16h
net-test1-5fcc69db59-wzlmg           1/1     Running   2          2d16h
net-test1-5fcc69db59-xthfd           1/1     Running   2          2d16h
nginx-deployment-574b87c764-9m59f    1/1     Running   1          34h
tomcat-deployment-7cd955f48c-lthk2   1/1     Running   1          34h

3.2 操作命令和语法

K8S学习--Kubeadm-5-资源管理核心概念_第5张图片
K8S学习--Kubeadm-5-资源管理核心概念_第6张图片
https://kubernetes.io/zh/docs/reference/kubectl/overview/#参考链接

root@master-1:~# kubectl get service
NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes              ClusterIP   192.168.0.1      <none>        443/TCP        2d19h
magedu-nginx-service    NodePort    192.168.9.132    <none>        80:30004/TCP   37h
magedu-tomcat-service   NodePort    192.168.14.155   <none>        80:31849/TCP   35h

root@master-1:~# kubectl describe service magedu-tomcat-service #不加最后参数则查看全部的service
Name:                     magedu-tomcat-service
Namespace:                default
Labels:                   app=kaivi-tomcat-service-label
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":
                            {"annotations":{},"labels":{"app":"kaivi-tomcat-service-
                            label"},"name":"magedu-tomcat-servi...
Selector:                 app=tomcat
Type:                     NodePort
IP:                       192.168.14.155
Port:                     http  80/TCP
TargetPort:               8080/TCP
NodePort:                 http  31849/TCP
Endpoints:                10.10.4.7:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
root@master-1:~# kubectl explain pod  #查看某个对象的方法 层层嵌套 

root@master-1:~# kubectl explain pod.apiVersion

root@master-1:~# kubectl explain deployment.spec.selector

Crete和apply的区别:

apply支持对yaml文件的多次修改和动态生效,修改完成重新执行apply -f file.yml
crete 单次创建资源 后期如果修改yml文件下想生效 那么在删除之前的资源再重新创建 而且文件创建过程需要在删除之前修改 然后再重新创建 先删再改再创建

root@master-1:~# kubectl cluster-info 
Kubernetes master is running at https://172.20.10.248:6443
KubeDNS is running at https://172.20.10.248:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
root@master-1:~# kubectl cordon --help
Mark node as unschedulable.

Examples:
  # Mark node "foo" as unschedulable.
  kubectl cordon foo

Options:
      --dry-run=false: If true, only print the object that would be sent, without sending it.
  -l, --selector='': Selector (label query) to filter on

Usage:
  kubectl cordon NODE [options]

Use "kubectl options" for a list of global command-line options (applies to all commands).
root@master-1:~# kubectl cordon master-1 #不被调度
node/master-1 cordoned
root@master-1:~# kubectl get node 
NAME       STATUS                     ROLES    AGE     VERSION
master-1   Ready,SchedulingDisabled   master   2d19h   v1.17.4
master-2   Ready                      master   2d19h   v1.17.4
master-3   Ready                      master   2d18h   v1.17.4
node-1     Ready                      <none>   2d18h   v1.17.4
node-2     Ready                      <none>   2d18h   v1.17.4
node-3     Ready                      <none>   2d18h   v1.17.4
root@master-1:~# kubectl uncordon master-1 #取消不被调度
node/master-1 uncordoned
root@master-1:~# kubectl get node 
NAME       STATUS   ROLES    AGE     VERSION
master-1   Ready    master   2d19h   v1.17.4
master-2   Ready    master   2d19h   v1.17.4
master-3   Ready    master   2d18h   v1.17.4
node-1     Ready    <none>   2d18h   v1.17.4
node-2     Ready    <none>   2d18h   v1.17.4
node-3     Ready    <none>   2d18h   v1.17.4
root@master-1:~# kubectl drain --help #驱逐无状态服务 用于node紧急下线

Usage:
  kubectl drain NODE [options]
root@master-1:~# kubectl api-resources
NAME                              SHORTNAMES   APIGROUP                       NAMESPACED   KIND
bindings                                                                      true         Binding
componentstatuses                 cs                                          false        ComponentStatus
configmaps                        cm                                          true         ConfigMap
endpoints                         ep                                          true         Endpoints
events                            ev                                          true         Event
limitranges                       limits                                      true         LimitRange
namespaces                        ns                                          false        Namespace
nodes                             no                                          false        Node
persistentvolumeclaims            pvc                                         true         PersistentVolumeClaim
persistentvolumes                 pv                                          false        PersistentVolume
pods                              po                                          true         Pod
podtemplates                                                                  true         PodTemplate
replicationcontrollers            rc                                          true         ReplicationController
resourcequotas                    quota                                       true         ResourceQuota
secrets                                                                       true         Secret
serviceaccounts                   sa                                          true         ServiceAccount
services                          svc                                         true         Service
mutatingwebhookconfigurations                  admissionregistration.k8s.io   false        MutatingWebhookConfiguration
validatingwebhookconfigurations                admissionregistration.k8s.io   false        ValidatingWebhookConfiguration
customresourcedefinitions         crd,crds     apiextensions.k8s.io           false        CustomResourceDefinition
apiservices                                    apiregistration.k8s.io         false        APIService
controllerrevisions                            apps                           true         ControllerRevision
daemonsets                        ds           apps                           true         DaemonSet
deployments                       deploy       apps                           true         Deployment
replicasets                       rs           apps                           true         ReplicaSet
statefulsets                      sts          apps                           true         StatefulSet
tokenreviews                                   authentication.k8s.io          false        TokenReview
localsubjectaccessreviews                      authorization.k8s.io           true         LocalSubjectAccessReview
selfsubjectaccessreviews                       authorization.k8s.io           false        SelfSubjectAccessReview
selfsubjectrulesreviews                        authorization.k8s.io           false        SelfSubjectRulesReview
subjectaccessreviews                           authorization.k8s.io           false        SubjectAccessReview
horizontalpodautoscalers          hpa          autoscaling                    true         HorizontalPodAutoscaler
cronjobs                          cj           batch                          true         CronJob
jobs                                           batch                          true         Job
certificatesigningrequests        csr          certificates.k8s.io            false        CertificateSigningRequest
leases                                         coordination.k8s.io            true         Lease
endpointslices                                 discovery.k8s.io               true         EndpointSlice
events                            ev           events.k8s.io                  true         Event
ingresses                         ing          extensions                     true         Ingress
ingresses                         ing          networking.k8s.io              true         Ingress
networkpolicies                   netpol       networking.k8s.io              true         NetworkPolicy
runtimeclasses                                 node.k8s.io                    false        RuntimeClass
poddisruptionbudgets              pdb          policy                         true         PodDisruptionBudget
podsecuritypolicies               psp          policy                         false        PodSecurityPolicy
clusterrolebindings                            rbac.authorization.k8s.io      false        ClusterRoleBinding
clusterroles                                   rbac.authorization.k8s.io      false        ClusterRole
rolebindings                                   rbac.authorization.k8s.io      true         RoleBinding
roles                                          rbac.authorization.k8s.io      true         Role
priorityclasses                   pc           scheduling.k8s.io              false        PriorityClass
csidrivers                                     storage.k8s.io                 false        CSIDriver
csinodes                                       storage.k8s.io                 false        CSINode
storageclasses                    sc           storage.k8s.io                 false        StorageClass
volumeattachments                              storage.k8s.io                 false        VolumeAttachment

3.3输出选项和语法

K8S学习--Kubeadm-5-资源管理核心概念_第7张图片

root@master-1:~# kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
net-test1-5fcc69db59-jz944           1/1     Running   1          2d16h
net-test1-5fcc69db59-wzlmg           1/1     Running   2          2d16h
net-test1-5fcc69db59-xthfd           1/1     Running   2          2d16h
nginx-deployment-574b87c764-9m59f    1/1     Running   1          35h
tomcat-deployment-7cd955f48c-lthk2   1/1     Running   1          35h
root@master-1:~# kubectl get pod -o wide
NAME                                 READY   STATUS    RESTARTS   AGE     IP          NODE     NOMINATED NODE   READINESS GATES
net-test1-5fcc69db59-jz944           1/1     Running   1          2d16h   10.10.3.3   node-1   <none>           <none>
net-test1-5fcc69db59-wzlmg           1/1     Running   2          2d16h   10.10.4.9   node-2   <none>           <none>
net-test1-5fcc69db59-xthfd           1/1     Running   2          2d16h   10.10.5.8   node-3   <none>           <none>
nginx-deployment-574b87c764-9m59f    1/1     Running   1          35h     10.10.5.9   node-3   <none>           <none>
tomcat-deployment-7cd955f48c-lthk2   1/1     Running   1          35h     10.10.4.7   node-2   <none>           <none>

4.K8S----API

k8s的几个重要概念

对象用k8s是和什么打交道?
K8s声明式API
列举下面yum文件为例子:

apiVersion: apps/v1  #创建该对象所使用的KubernetesAPI 的版本
kind: Deployment     #kind-想要创建的对象的类型  
metadata:            #帮助识别对象唯一性的数据,包括一个name名称、可选的namespace
  name: nginx-deployment
  labels:
    app: nginx
spec:            #定义容器的状态 可以定义多个容器 名称不能冲突
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: harbor.linux39.com/baseimages/nginx:1.14.2
        ports:
        - containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: kaivi-nginx-service-label
  name: magedu-nginx-service
  namespace: default
spec:
  type: NodePort
  ports:
  - name: http
    port: 80  #service端口  通过service端口的80转发到容器的(targetPort)pod端口80
    protocol: TCP
    targetPort: 80 #pod端口
    nodePort: 30004  #宿主机端口   通过宿主机端口30004访问到service端口的80
  selector:
    app: nginx

必需字段怎么声明?
1.apiVersion-创建该对象所使用的KubernetesAPI 的版本
2.kind-想要创建的对象的类型
3.metadata-帮助识别对象唯一性的数据,包括一个name名称、可选的namespace
4.spec 定义容器的状态 可以定义多个容器 名称不能冲突
5. status(Pod创建完成后k8s自动生成status状态)

root@master-1:~# kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
net-test1-5fcc69db59-jz944           1/1     Running   1          2d18h
net-test1-5fcc69db59-wzlmg           1/1     Running   2          2d18h
net-test1-5fcc69db59-xthfd           1/1     Running   2          2d18h
nginx-deployment-574b87c764-9m59f    1/1     Running   1          36h
tomcat-deployment-7cd955f48c-lthk2   1/1     Running   1          36h

root@master-1:~# kubectl describe pod tomcat-deployment-7cd955f48c-lthk2
Name:         tomcat-deployment-7cd955f48c-lthk2
Namespace:    default
Priority:     0
Node:         node-2/172.20.10.201
Start Time:   Mon, 30 Mar 2020 22:15:46 +0800
Labels:       app=tomcat
              pod-template-hash=7cd955f48c
Annotations:  <none>
Status:       Running   #状态是否runing
IP:           10.10.4.7
IPs:
  IP:           10.10.4.7
Controlled By:  ReplicaSet/tomcat-deployment-7cd955f48c
Containers:
  tomcat:
    Container ID:   docker://3ad024e3fa02efb0013ea776200ad70d684ee468b76b777d2c21a5017e65c660
    Image:          harbor.linux39.com/baseimages/tomcat:app
    Image ID:       docker-pullable://harbor.linux39.com/baseimages/tomcat@sha256:de80cfab99f015db3c47ea33cab64cc4e6
    5dd5d41a147fd6c9fc41fcfaeb69f1
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Running      #状态是否runing
      Started:      Wed, 01 Apr 2020 08:32:44 +0800
    Last State:     Terminated
      Reason:       Error
      Exit Code:    255
      Started:      Mon, 30 Mar 2020 22:19:37 +0800
      Finished:     Wed, 01 Apr 2020 08:26:14 +0800
    Ready:          True
    Restart Count:  1
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-9n88d (ro)
Conditions:
  Type              Status  #状态的查询
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-9n88d:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-9n88d
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:          <none>

yaml文件及语法基础:

需要提前创建好yaml文件,并创建好好pod运行所需要的namespace、yaml文件等资源

root@master-1:~# cd /opt/
root@master-1:/opt# mkdir file-yaml
root@master-1:/opt# cd file-yaml/
root@master-1:/opt/file-yaml# vim linux39-ns.yml
apiVersion: v1 #API版本
kind: Namespace #类型为namespac
metadata: #定义元数据
  name: linux39 #namespace名称

root@master-1:/opt/file-yaml# kubectl get ns
NAME                   STATUS   AGE
default                Active   2d20h
kube-node-lease        Active   2d20h
kube-public            Active   2d20h
kube-system            Active   2d20h
kubernetes-dashboard   Active   2d16h

root@master-1:/opt/file-yaml# kubectl apply -f linux39-ns.yml 
namespace/linux39 created

root@master-1:/opt/file-yaml# kubectl get ns
NAME                   STATUS   AGE
default                Active   2d20h
kube-node-lease        Active   2d20h
kube-public            Active   2d20h
kube-system            Active   2d20h
kubernetes-dashboard   Active   2d16h
linux39                Active   8s       #新创建的namespace

K8S学习--Kubeadm-5-资源管理核心概念_第8张图片
查看linux39的namespace已经存储到etcd 但是现在还没有任何数据

http://www.bejson.com/validators/yaml_editor/#在线yaml与json编辑器

大小写敏感
使用缩进表示层级关系
缩进时不允许使用Tal键,只允许使用空格
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
使用”#” 表示注释,从这个字符一直到行尾,都会被解析器忽略
比json更适用于配置文件

yaml文件主要特性:

上下级关系
列表
键值对(也称为maps,即key:value 格式的键值对数据)

Nginx 业务yaml文件详解

# pwd
/opt/k8s-data/yaml/linux39
# mkdir nginx-tomcat-app1 tomcat-app2
# cd nginx/

# pwd
/opt/k8s-data/yaml/linux39/nginx

# cat nginx.yaml
kind: Deployment  #类型,是deployment控制器,kubectl explain Deployment
apiVersion: extensions/v1 #API版本,# kubectl explain Deployment.apiVersion 查看版本 需要保持一致
metadata: #pod的元数据信息,kubectl explain Deployment.metadata
  labels: #自定义pod的标签,# kubectl explain Deployment.metadata.labels 用于做筛选serivice接口
    app: linux39-nginx-deployment-label #标签名称为app值为linux39-nginx-deployment-label,后面会用到此标签
  name: linux39-nginx-deployment #pod的名称
  namespace: linux39 #pod的namespace,默认是defaule
spec: #定义deployment中容器的详细信息,kubectl explain Deployment.spec
  replicas: 1 #创建出的pod的副本数,即多少个pod,默认值为1 根据实际生产决定 kubectl explain Deployment.spec.replicas
  selector: #定义标签选择器 在新版中必须设置这个参数
    matchLabels: #定义匹配的标签,必须要设置
      app: linux39-nginx-selector #匹配的目标标签, 和Deployment.spec.template.app保持一致
  template: #定义模板,必须定义,模板是起到描述要创建的pod的作用
    metadata: #定义模板元数据
      labels: #定义模板label,Deployment.spec.template.metadata.labels
        app: linux39-nginx-selector #定义标签,等于Deployment.spec.selector.matchLabels 一定要保持一致
    spec: #定义pod信息 在当前的pod容器定义信息 
      containers:#定义pod中容器列表,可以多个至少一个,pod不能动态增减容器 只能是先删除再重新创建
      - name: linux39-nginx-container #容器名称  “-”表示数组 可以同时写多个 但是要平级
		image: harbor.magedu.net/linux39/nginx-web1:v1 #镜像地址
        #command: ["/apps/tomcat/bin/run_tomcat.sh"] #容器启动执行的命令或脚本
		#imagePullPolicy: IfNotPresent   #用已经有的镜像  没有再去拉取镜像 
		imagePullPolicy: Always #拉取镜像策略 重新拉取镜像 比较消耗带宽
		ports: #定义容器端口列表
	    - containerPort: 80 #定义一个端口
		  protocol: TCP #端口协议  只有TCP和UDP
		  name: http #端口名称
	    - containerPort: 443 #定义一个端口
	      protocol: TCP #端口协议
		  name: https #端口名称
		 env: #配置环境变量  用于容器传递变量
         - name: "password" #变量名称。必须要用引号引起来
	       value: "123456" #当前变量的值
		 - name: "age" #另一个变量名称
		   value: "18" #另一个变量的值
		 resources: #对资源的请求设置和限制设置 
	       limits: #资源限制设置,上限  硬限制
		     cpu: 2 #cpu的限制,单位为core数,可以写0.5或者500m等CPU压缩值,1000毫核
		     memory: 2Gi #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
		   requests: #资源请求的设置  软限制
		     cpu: 1 #cpu请求数,容器启动的初始可用数量,可以写0.5或者500m等CPU压缩值
			 memory: 512Mi #内存请求大小,容器启动的初始可用数量,用于调度pod时候使用
---
kind: Service #类型为service   K8S内部的均衡调用请求
apiVersion: v1 #service API版本, service.apiVersion
metadata: #定义service元数据,service.metadata
  labels: #自定义标签,service.metadata.labels 用于K8S中的HPA动态扩容
	app: linux39-nginx #定义service标签的内容
  name: linux38-nginx-spec #定义service的名称,此名称会被DNS解析
  namespace: linux39 #该service隶属于的namespaces名称,即把service创建到哪个namespace里面
spec: #定义service的详细信息,service.spec
  type: NodePort #service的类型,定义服务的访问方式,默认为ClusterIP, service.spec.type
  ports: #定义访问端口, service.spec.ports
  - name: http #定义一个端口名称
    port: 80 #service 80端口
	protocol: TCP #协议类型
	targetPort: 80 #目标pod的端口
	nodePort: 30001 #node节点暴露的端口
  - name: https #SSL 端口
	port: 443 #service 443端口
	protocol: TCP #端口协议
	targetPort: 443 #目标pod端口
	nodePort: 30043 #node节点暴露的SSL端口
  selector: #service的标签选择器,定义要访问的目标pod
    app: linux39-nginx #将流量路到选择的pod上,须等于Deployment.spec.selector.matchLabels

spec和status的区别:
spec是期望状态
status是实际状态

Pod概述:
1.pod是k8s中的最小单元
2.一个pod中可以运行一个容器,也可以运行多个容器
3.运行多个容器的话,这些容器是一起被调度的
4.Pod的生命周期是短暂的,不会自愈,是用完就销毁的实体
5.一般我们是通过Controller来创建和管理pod的

Controller:控制器

https://kubernetes.io/zh/docs/concepts/workloads/controllers/replicationcontroller/#ReplicationController

https://kubernetes.io/zh/docs/concepts/overview/working-with-objects/labels/#标签选择器

5.实验实例

root@master-1:/opt/k8s-data/yaml/namespaces# pwd
/opt/k8s-data/yaml/namespaces
root@master-1:/opt/k8s-data/yaml/namespaces# ll
total 16
drwxr-xr-x 2 root root 4096 Apr  1 21:03 ./
drwxr-xr-x 6 root root 4096 Apr  1 20:58 ../
-rw-r--r-- 1 root root  121 Apr  1 21:00 linux39-ns.yml
-rw-r--r-- 1 root root  121 Apr  1 21:03 linux40-ns.yml
root@master-1:/opt/k8s-data/yaml/namespaces# cat linux*
apiVersion: v1 #API版本
kind: Namespace #类型为namespac
metadata: #定义元数据
  name: linux39 #namespace名称


apiVersion: v1 #API版本
kind: Namespace #类型为namespac
metadata: #定义元数据
  name: linux40 #namespace名称
root@master-1:/opt/k8s-data/yaml/namespaces# kubectl apply -f linux39-ns.yml  
root@master-1:/opt/k8s-data/yaml/namespaces# kubectl apply -f linux40-ns.yml
root@master-1:/opt/k8s-data/yaml/namespaces# kubectl get ns
NAME                   STATUS   AGE
default                Active   3d6h
kube-node-lease        Active   3d6h
kube-public            Active   3d6h
kube-system            Active   3d6h
kubernetes-dashboard   Active   3d2h
linux39                Active   6h
linux40                Active   12s

case1 :pod的控制器类型

root@master-1:/opt/k8s-data/yaml/linux39/case1# pwd
/opt/k8s-data/yaml/linux39/case1
root@master-1:/opt/k8s-data/yaml/linux39/case1# ll
total 20
drwxr-xr-x 2 root root 4096 Apr  1 21:14 ./
drwxr-xr-x 8 root root 4096 Apr  1 21:08 ../
-rw-r--r-- 1 root root  523 Apr  1 21:14 deployment.yml
-rw-r--r-- 1 root root  388 Mar 30 18:33 rc.yml
-rw-r--r-- 1 root root  459 Mar 30 18:33 rs.yml

deployment

root@master-1:/opt/k8s-data/yaml/linux39/case1# vim deployment.yml 
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: linux39
spec:
  replicas: 2
  selector:
    #app: ng-deploy-80 #rc
    #matchLabels: #rs or deployment
    #  app: ng-deploy-80

    matchExpressions:
      - {key: app, operator: In, values: [ng-deploy-80,ng-rs-81]}
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx
        ports:
        - containerPort: 80
        - 
root@master-1:/opt/k8s-data/yaml/linux39/case1# kubectl apply -f deployment.yml 
deployment.apps/nginx-deployment created

root@master-1:/opt/k8s-data/yaml/linux39/case1# kubectl get pod -n linux39
NAME                                READY   STATUS              RESTARTS   AGE
nginx-deployment-6997c89dfb-8gk5t   0/1     ContainerCreating   0          15s #处于创建状态 正在拉取镜像
nginx-deployment-6997c89dfb-dvg9b   0/1     ContainerCreating   0          15s

root@master-1:/opt/k8s-data/yaml/linux39/case1# kubectl get pod -n linux39
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-6997c89dfb-8gk5t   1/1     Running   0          2m22s  #已经正常运行
nginx-deployment-6997c89dfb-dvg9b   1/1     Running   0          2m22s

ReplicaSet

root@master-1:/opt/k8s-data/yaml/linux39/case1# vim rs.yml #ReplicaSet控制器
apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: ReplicaSet  #ReplicaSet控制器
metadata:
  name: frontend
  namespace: linux39
spec:
  replicas: 3
  selector:
    #matchLabels:
    #  app: ng-rs-80
    matchExpressions:
      - {key: app, operator: In, values: [ng-rs-80,ng-rs-81]} #正则匹配多个
  template:
    metadata:
      labels:
        app: ng-rs-80
    spec:
      containers:
      - name: ng-rs-80
        image: nginx
        ports:
        - containerPort: 80

先把之前的资源删除:

root@master-1:/opt/k8s-data/yaml/linux39/case1# kubectl delete -f deployment.yml 
deployment.apps "nginx-deployment" deleted
root@master-1:/opt/k8s-data/yaml/linux39/case1# kubectl get pod -n linux39
No resources found in linux39 namespace.

用ReplicaSet创建新的资源

root@master-1:/opt/k8s-data/yaml/linux39/case1# kubectl apply -f rs.yml 
replicaset.apps/frontend created
root@master-1:/opt/k8s-data/yaml/linux39/case1# kubectl get pod -n linux39
NAME             READY   STATUS              RESTARTS   AGE
frontend-749kw   0/1     ContainerCreating   0          6s
frontend-krjxb   0/1     ContainerCreating   0          6s
frontend-xgrcl   0/1     ContainerCreating   0          6s

root@master-1:/opt/k8s-data/yaml/linux39/case1# kubectl get pod -n linux39
NAME             READY   STATUS    RESTARTS   AGE
frontend-749kw   1/1     Running   0          110s
frontend-krjxb   1/1     Running   0          110s
frontend-xgrcl   1/1     Running   0          110s

rs需要先删除之后才能再次修改 除非加一些参数选项

root@master-1:/opt/k8s-data/yaml/linux39/case1# kubectl delete -f rs.yml 
replicaset.apps "frontend" deleted

root@master-1:/opt/k8s-data/yaml/linux39/case1# kubectl create --help

root@master-1:/opt/k8s-data/yaml/linux39/case1# kubectl create -f rs.yml --save-config=true #再次创建
replicaset.apps/frontend created
root@master-1:/opt/k8s-data/yaml/linux39/case1# vim rs.yml 
  replicas: 2 #把副本的数量改为2个
root@master-1:/opt/k8s-data/yaml/linux39/case1# kubectl apply -f rs.yml  #再次创建还是依赖apply
replicaset.apps/frontend configured
root@master-1:/opt/k8s-data/yaml/linux39/case1# kubectl get pod -n linux39
NAME             READY   STATUS    RESTARTS   AGE
frontend-4bhjv   1/1     Running   0          62s
frontend-r6trh   1/1     Running   0          62s

ReplicationController(快淘汰)

root@master-1:/opt/k8s-data/yaml/linux39/case1# vim rc.yml #ReplicationController控制器
apiVersion: v1
kind: ReplicationController
metadata:
  name: ng-rc
  namespace: linux39
spec:
  replicas: 2
  selector:
    app: ng-rc-80
    #app1: ng-rc-81

  template:
    metadata:
      labels:
        app: ng-rc-80
        #app1: ng-rc-81
    spec:
      containers:
      - name: ng-rc-80
        image: nginx
        ports:
        - containerPort: 80
root@master-1:/opt/k8s-data/yaml/linux39/case1# kubectl delete -f deployment.yml 
deployment.apps "nginx-deployment" deleted
root@master-1:/opt/k8s-data/yaml/linux39/case1# kubectl get pod -n linux39
No resources found in linux39 namespace.

用ReplicationController创建新的资源

root@master-1:/opt/k8s-data/yaml/linux39/case1# kubectl apply -f rc.yml 
replicationcontroller/ng-rc created
root@master-1:/opt/k8s-data/yaml/linux39/case1# kubectl get pod -n linux39
NAME          READY   STATUS    RESTARTS   AGE
ng-rc-4tp5p   1/1     Running   0          17s
ng-rc-j7tfx   1/1     Running   0          17s

Rc,Rs和Deployment
•ReplicationController:副本控制器(selector= 或者!=)(等于或者不等于)
•ReplicaSet:副本控制集,和副本控制器的区别是:对选择器的支持(selector还支持innotin)
•Deployment:比rs更高一级的控制器,除了有rs的功能之外,还有很多高级功能,,比如说最重要的:滚动升级、回滚等
https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/

Service

•Why:pod重启之后ip就变了,pod之间直接访问会有问题
•What:解耦了服务和应用。简化服务的调用
•How:声明一个service对象

一般常用的有两种:
•k8s集群内的service:selector指定pod,自动创建Endpoints
•k8s集群外的service:手动创建Endpoints,指定外部服务的ip,端口和协议

kube-proxy和service的关系:
kube-proxy——————> k8s-apiserver
watch
kube-proxy监听着k8s-apiserver,一旦service资源发生变化(调k8s-api修改service信息),kube-proxy就会生成对应的负载调度的调整,这样就保证service的最新状态。

kube-proxy有三种调度模型:
•userspace:k8s 1.1之前 )(淘汰)
•iptables:k8s1.10之前 (还能用)
•ipvs:k8s 1.11之后,如果没有开启ipvs,则自动降级为iptables

Service和deployment实现一个nginx

root@master-1:/opt/k8s-data/yaml/linux39/case2# pwd
/opt/k8s-data/yaml/linux39/case2
root@master-1:/opt/k8s-data/yaml/linux39/case2# ll
total 3916
drwxr-xr-x 2 root root    4096 Apr  1 21:11 ./
drwxr-xr-x 8 root root    4096 Apr  1 21:08 ../
-rw-r--r-- 1 root root     542 Mar 30 18:33 1-deploy_node.yml
-rw-r--r-- 1 root root     214 Mar 30 18:33 2-svc_service.yml
-rw-r--r-- 1 root root     233 Mar 30 18:33 3-svc_NodePort.yml
-rw-r--r-- 1 root root 3983872 Mar 30 18:33 busybox-online.tar.gz
-rw-r--r-- 1 root root     277 Mar 30 18:33 busybox.yaml
root@master-1:/opt/k8s-data/yaml/linux39/case2# 
root@master-1:/opt/k8s-data/yaml/linux39/case2# vim 1-deploy_node.yml 
root@master-1:/opt/k8s-data/yaml/linux39/case2# vim 1-deploy_node.yml 
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: linux39
spec:
  replicas: 1
  selector:
    #matchLabels: #rs or deployment
    #  app: ng-deploy3-80
    matchExpressions:
      - {key: app, operator: In, values: [ng-deploy-80,ng-rs-81]}
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx:1.17.5
        ports:
        - containerPort: 80
      #nodeSelector:
      #  env: group1

root@master-1:/opt/k8s-data/yaml/linux39/case2# kubectl apply -f 1-deploy_node.yml 
deployment.apps/nginx-deployment created
root@master-1:/opt/k8s-data/yaml/linux39/case2# kubectl get pod -n linux39
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-85ff9fcf5b-b77fp   1/1     Running   0          105s

ClusterIP 内部访问

root@master-1:/opt/k8s-data/yaml/linux39/case2# pwd
/opt/k8s-data/yaml/linux39/case2
root@master-1:/opt/k8s-data/yaml/linux39/case2# vim 2-svc_service.yml 
apiVersion: v1
kind: Service
metadata:
  name: ng-deploy-80
  namespace: linux39
spec:
  ports:
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP
  type: ClusterIP
  selector:
    app: ng-deploy-80

root@master-1:/opt/k8s-data/yaml/linux39/case2# kubectl apply -f 2-svc_service.yml 
service/ng-deploy-80 created

root@master-1:~# kubectl get svc -n linux39  #获取linux39的svc集群地址
NAME           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
ng-deploy-80   ClusterIP   192.168.15.201   <none>        80/TCP    3m45s

进入到pod服务器

root@master-1:/opt/k8s-data/yaml/linux39/case2# kubectl get pod 
NAME                                 READY   STATUS    RESTARTS   AGE
net-test1-5fcc69db59-jz944           1/1     Running   1          3d6h
net-test1-5fcc69db59-wzlmg           1/1     Running   2          3d6h
net-test1-5fcc69db59-xthfd           1/1     Running   2          3d6h
nginx-deployment-574b87c764-9m59f    1/1     Running   1          2d
tomcat-deployment-7cd955f48c-lthk2   1/1     Running   1          2d

root@master-1:/opt/k8s-data/yaml/linux39/case2# kubectl exec -it net-test1-5fcc69db59-xthfd  sh
/ # root@master-1:/opt/k8s-data/yaml/linux39/case2# 
/ # apk add curl
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/community/x86_64/APKINDEX.tar.gz
(1/4) Installing ca-certificates (20191127-r1)
(2/4) Installing nghttp2-libs (1.40.0-r0)
(3/4) Installing libcurl (7.67.0-r0)
(4/4) Installing curl (7.67.0-r0)
Executing busybox-1.31.1-r9.trigger
Executing ca-certificates-20191127-r1.trigger
OK: 7 MiB in 18 packages
/ # 
/ # curl 192.168.15.201 #访问svc集权地址 看是否能够联通
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
。。。。。。
/ # 
/ # ping ng-deploy-80  #ping一下service名称 不通
ping: bad address 'ng-deploy-80'

busybox镜像创建:

root@master-1:/opt/k8s-data/yaml/linux39/case2# docker pull busybox

root@master-1:/opt/k8s-data/yaml/linux39/case2# docker images
busybox                        latest              83aa35aa1c79      3 weeks ago         1.22MB

root@master-1:/opt/k8s-data/yaml/linux39/case2# docker tag  83aa35aa1c79  harbor.linux39.com/baseimages/busybox 

root@master-1:/opt/k8s-data/yaml/linux39/case2# docker push harbor.linux39.com/baseimages/busybox 

K8S学习--Kubeadm-5-资源管理核心概念_第9张图片

root@master-1:/opt/k8s-data/yaml/linux39/case2# vim busybox.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: linux39  #default namespace的DNS
spec:
  containers:
  - image: harbor.linux39.com/baseimages/busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: Always
    name: busybox
  restartPolicy: Always
  
root@master-1:/opt/k8s-data/yaml/linux39/case2# kubectl apply -f busybox.yaml 
pod/busybox created
root@master-1:/opt/k8s-data/yaml/linux39/case2# kubectl get pod -n linux39
NAME                                READY   STATUS    RESTARTS   AGE
busybox                             1/1     Running   0          35s
nginx-deployment-85ff9fcf5b-b77fp   1/1     Running   0          25m

测试在同一个namespace中能够ping通
这里进入到busybox的pod中进行测试:进行ping之前在

root@master-1:/opt/k8s-data/yaml/linux39/case2# kubectl exec -it busybox sh -n linux39
/ # 
/ # ping ng-deploy-80 #访问service名称 
PING ng-deploy-80 (192.168.15.201): 56 data bytes #虽然ping不通但是能解析DNS 也说明能够访问
^C                            
--- ng-deploy-80 ping statistics ---
26 packets transmitted, 0 packets received, 100% packet loss
/ # wget ng-deploy-80
Connecting to ng-deploy-80 (192.168.15.201:80)
saving to 'index.html'
index.html           100% |*********************************************************************|   612  0:00:00 ETA
'index.html' saved
/ # cat index.html 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

结论:在同一个namespace中 可以直接通过service的名称进行访问 在yaml文件中直接指定service-name即可
可以实现微服务对外不访问

service对外访问

root@master-1:/opt/k8s-data/yaml/linux39/case2# vim 3-svc_NodePort.yml 
apiVersion: v1
kind: Service
metadata:
  name: ng-deploy-80
  namespace: linux39
spec:
  ports:
  - name: http
    port: 81
    targetPort: 80  #pod中的服务端口 一定要写对
    nodePort: 30012 #宿主机暴露端口 
    protocol: TCP
  type: NodePort
  selector:
    app: ng-deploy-80
root@master-1:/opt/k8s-data/yaml/linux39/case2# kubectl apply -f 3-svc_NodePort.yml 
service/ng-deploy-80 configured

30012这个自定义端口在K8S集群中每一个宿主机都会监听的一个端口,只要有这个端口就能通过这个端口访问到service地址进而service端口转发到内部的pod节点

#ss -tnl 

在任何一个K8S集群节点都能访问
K8S学习--Kubeadm-5-资源管理核心概念_第10张图片

Volume

容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题。 首先,当容器崩溃时,kubelet 将重新启动容器,容器中的文件将会丢失——因为容器会以干净的状态重建。 其次,当在一个 Pod 中同时运行多个容器时,常常需要在这些容器之间共享文件。 Kubernetes 抽象出 Volume 对象来解决这两个问题。

数据和镜像解耦,以及容器间的数据共享
k8s抽象出的一个对象,用来保存数据,做存储用
常用的几种卷:
emptyDir:本地临时卷
hostPath:本地卷
nfs等:共享卷
configmap: 配置文件

CASE3:emptyDir

https://kubernetes.io/zh/docs/concepts/storage/volumes/#emptydir # emptyDir

当Pod 被分配给节点时,首先创建emptyDir卷,并且只要该Pod 在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除Pod 时,emptyDir中的数据将被永久删除。

Pod 示例

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}
root@master-1:/opt/k8s-data/yaml/linux39/case3# pwd
/opt/k8s-data/yaml/linux39/case3

root@master-1:/opt/k8s-data/yaml/linux39/case3# vim deploy_empty.yml 
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: linux39
spec:
  replicas: 1
  selector:
    matchLabels: #rs or deployment
      app: ng-deploy-80
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /cache
          name: cache-volume
      volumes:
      - name: cache-volume
        emptyDir: {}
root@master-1:/opt/k8s-data/yaml/linux39/case3# kubectl apply -f deploy_empty.yml 
deployment.apps/nginx-deployment created

root@master-1:/opt/k8s-data/yaml/linux39/case3# kubectl get pod -n linux39
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-7cc86d98d5-8gbcb   1/1     Running   0          62s

root@master-1:/opt/k8s-data/yaml/linux39/case3# kubectl exec -it nginx-deployment-7cc86d98d5-8gbcb bash -n linux39
root@nginx-deployment-7cc86d98d5-8gbcb:/# cd /cache/
root@nginx-deployment-7cc86d98d5-8gbcb:/cache# echo 112233 > linux39.txt
root@nginx-deployment-7cc86d98d5-8gbcb:/cache# exit
exit
root@master-1:/opt/k8s-data/yaml/linux39/case3#
root@master-1:/opt/k8s-data/yaml/linux39/case3# kubectl get pod -n linux39 -o wide #查看创建的数据在哪一个节点 发现在node-3中
NAME                                READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
nginx-deployment-7cc86d98d5-8gbcb   1/1     Running   0          11m   10.10.5.19   node-3   <none>           <none>

在node-3中查找数据的存储目录

root@Node-3:~# find / -name linux39.txt
/var/lib/kubelet/pods/014f1689-ca48-4f1b-b955-9381f9148dbf/volumes/kubernetes.io~empty-dir/cache-volume/linux39.txt
^C
root@Node-3:~# cat /var/lib/kubelet/pods/014f1689-ca48-4f1b-b955-9381f9148dbf/volumes/kubernetes.io~empty-dir/cache-volume/linux39.txt
112233

上面的路径是固定的。但是pod的编号ID(014f1689-ca48-4f1b-b955-9381f9148dbf)不是 这里可以用 * 进行匹配
emptyDir的数据在pod被删除的同时 数据也会被删除清空

CASE4:hostPath

https://kubernetes.io/zh/docs/concepts/storage/volumes/#hostpath#hostPath

hostPath 卷能将主机节点文件系统上的文件或目录挂载到您的 Pod 中。 虽然这不是大多数 Pod 需要的,但是它为一些应用程序提供了强大的逃生舱。

hostPath卷将主机节点的文件系统中的文件或目录挂载到集群中,pod删除的时候,卷不会被删除

#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ng-deploy-80
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /data/mysql
          name: data-volume  #和下面volumes的挂载名称要一致
      volumes:
      - name: data-volume #定义挂载的名称
        hostPath:   #指定使用什么类型 什么样子的卷 
          path: /data/mysql
root@master-1:/opt/k8s-data/yaml/linux39/case4# kubectl apply -f deploy_hostPath.yml 
deployment.apps/nginx-deployment-2 created

root@master-1:/opt/k8s-data/yaml/linux39/case4# kubectl get pod 
NAME                                  READY   STATUS    RESTARTS   AGE
net-test1-5fcc69db59-jz944            1/1     Running   1          4d6h
net-test1-5fcc69db59-wzlmg            1/1     Running   2          4d6h
net-test1-5fcc69db59-xthfd            1/1     Running   2          4d6h
nginx-deployment-2-7944748bc4-xpbln   1/1     Running   0          34s
nginx-deployment-574b87c764-9m59f     1/1     Running   1          3d
tomcat-deployment-7cd955f48c-lthk2    1/1     Running   1          3d
root@master-1:/opt/k8s-data/yaml/linux39/case4# kubectl get pod -o wide #查看在哪一个主机中 在node-3中
NAME                                  READY   STATUS    RESTARTS   AGE         IP           NODE     NOMINATED NODE   READINESS GATES
net-test1-5fcc69db59-jz944            1/1     Running   1          4d4h        10.10.3.3    node-1   <none>           <none>
net-test1-5fcc69db59-wzlmg            1/1     Running   2          4d4h        10.10.4.9    node-2   <none>           <none>
net-test1-5fcc69db59-xthfd            1/1     Running   2          4d4h        10.10.5.8    node-3   <none>           <none>
nginx-deployment-2-7944748bc4-xpbln   1/1     Running   0          <invalid>   10.10.5.20   node-3   <none>           <none>
nginx-deployment-574b87c764-9m59f     1/1     Running   1          2d22h       10.10.5.9    node-3   <none>           <none>
tomcat-deployment-7cd955f48c-lthk2    1/1     Running   1          2d22h       10.10.4.7    node-2   <none>           <none>

可以去node-3主机中查看是否自动创建了一个/data/mysql的目录

root@master-1:/opt/k8s-data/yaml/linux39/case4# kubectl exec -it nginx-deployment-2-66d68c95d9-46z6b bash
root@nginx-deployment-2-66d68c95d9-46z6b:/# cd /data/
root@nginx-deployment-2-66d68c95d9-46z6b:/data# mkdir logs
root@nginx-deployment-2-66d68c95d9-46z6b:/data# echo likai > logs/nginx.logs

root@Node-3中

root@Node-3:/data# cd mysql/
root@Node-3:/data/mysql# ll
total 12
drwxr-xr-x 3 root root 4096 Apr  2 23:10 ./
drwxr-xr-x 4 root root 4096 Apr  2 22:47 ../
drwxr-xr-x 2 root root 4096 Apr  2 23:11 logs/
root@Node-3:/data/mysql# cat logs/nginx.logs  #这份文件宿主机和pod容器就一份 同修改同删除
likai

验证:在pod被删除时候,之前的数据是否被删除

root@master-1:/opt/k8s-data/yaml/linux39/case4# kubectl delete -f deploy_hostPath.yml 
deployment.apps "nginx-deployment-2" deleted
root@Node-3:/data/mysql# cat logs/nginx.logs 
likai

hostPath卷将主机节点的文件系统中的文件或目录挂载到集群中,pod删除的时候,卷不会被删除

CASE5:nfs Volume

nfs:
nfs 卷能将 NFS (网络文件系统) 挂载到您的 Pod 中。 不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载掉了。 这意味着 nfs 卷可以被预先填充数据,并且这些数据可以在 Pod 之间”传递”。

•nfs卷允许将现有的NFS(网络文件系统)共享挂载到容器中。不像emptyDir,当删除Pod 时,nfs卷的内容被保留,卷仅仅是被卸载。这意味着NFS 卷可以预填充数据,并且可以在pod 之间“切换”数据。NFS 可以被多个写入者同时挂载。

警告:
在您使用 NFS 卷之前,必须运行自己的 NFS 服务器并将目标 share 导出备用。

这里实验复用HA-service1的机器:172.20.10.22

root@HA-server1:~# apt install nfs-server -y

root@HA-server1:~# mkdir /data/k8sdata -p

root@HA-server1:~# vim /etc/exports 
/data/k8sdata *(rw,no_root_squash)

root@HA-server1:~# systemctl restart nfs-server.service 
root@HA-server1:~# systemctl enable nfs-server.service 

在node节点上面查看共享出来的挂载卷。如果看不到说明配置有问题 后面实验也挂不上

root@Node-3:~# apt install nfs-common -y
root@Node-3:~# showmount -e 172.20.10.22
Export list for 172.20.10.22:
/data/k8sdata *

在node节点的宿主机挂载:

root@Node-3:~# mount -t nfs 172.20.10.22:/data/k8sdata /mnt #共享文件夹挂载到/mnt目录中

实验:

root@master-1:/opt/k8s-data/yaml/linux39/case5# pwd
/opt/k8s-data/yaml/linux39/case5
root@master-1:/opt/k8s-data/yaml/linux39/case5# ll
total 16
drwxr-xr-x 2 root root 4096 Apr  2 23:54 ./
drwxr-xr-x 8 root root 4096 Apr  1 21:08 ../
-rw-r--r-- 1 root root  804 Mar 30 18:33 deploy_nfs2.yml
-rw-r--r-- 1 root root  978 Apr  2 23:54 deploy_nfs.yml

root@master-1:/opt/k8s-data/yaml/linux39/case5# vim deploy_nfs.yml
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ng-deploy-80
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/share/nginx/html/mysite #把nfs的/data/k8sdata挂载到当前目录
          name: my-nfs-volume
      volumes:
      - name: my-nfs-volume
        nfs:
          server: 172.20.10.22 #nfs服务器地址
          path: /data/k8sdata

---
apiVersion: v1
kind: Service
metadata:
  name: ng-deploy-80
spec:
  ports:
  - name: http
    port: 81
    targetPort: 80
    nodePort: 30011 #对外暴露访问端口 
    protocol: TCP
  type: NodePort
  selector:
    app: ng-deploy-80
root@master-1:/opt/k8s-data/yaml/linux39/case5# kubectl apply -f deploy_nfs.yml 
deployment.apps/nginx-deployment-3 created
service/ng-deploy-80 created

root@master-1:/opt/k8s-data/yaml/linux39/case5# kubectl get pod
NAME                                  READY   STATUS    RESTARTS   AGE
net-test1-5fcc69db59-jz944            1/1     Running   1          4d7h
net-test1-5fcc69db59-wzlmg            1/1     Running   2          4d7h
net-test1-5fcc69db59-xthfd            1/1     Running   2          4d7h
nginx-deployment-3-587f55c665-jxjt2   1/1     Running   0          29s
nginx-deployment-574b87c764-9m59f     1/1     Running   1          3d1h
tomcat-deployment-7cd955f48c-lthk2    1/1     Running   1          3d1h

root@master-1:/opt/k8s-data/yaml/linux39/case5# kubectl exec -it nginx-deployment-3-587f55c665-jxjt2 bash
root@nginx-deployment-3-587f55c665-jxjt2:/# df -Th
Filesystem                 Type     Size  Used Avail Use% Mounted on
overlay                    overlay   92G  4.0G   83G   5% /
tmpfs                      tmpfs     64M     0   64M   0% /dev
tmpfs                      tmpfs    953M     0  953M   0% /sys/fs/cgroup
/dev/sda1                  ext4      92G  4.0G   83G   5% /etc/hosts
shm                        tmpfs     64M     0   64M   0% /dev/shm
tmpfs                      tmpfs    953M   12K  953M   1% /run/secrets/kubernetes.io/serviceaccount
172.20.10.22:/data/k8sdata nfs4      46G   52M   44G   1% /usr/share/nginx/html/mysite
tmpfs                      tmpfs    953M     0  953M   0% /proc/acpi
tmpfs                      tmpfs    953M     0  953M   0% /proc/scsi
tmpfs                      tmpfs    953M     0  953M   0% /sys/firmware

K8S学习--Kubeadm-5-资源管理核心概念_第11张图片

K8S学习--Kubeadm-5-资源管理核心概念_第12张图片
在共享数据中创建数据,看挂载node节点是否能够访问

root@HA-server1:/data/k8sdata# vim linux39.html
root@HA-server1:/data/k8sdata# cat linux39.html 
linux39 test page

K8S学习--Kubeadm-5-资源管理核心概念_第13张图片
新建一个pod 看一个存储是否能够被多个pod所挂载

root@master-1:/opt/k8s-data/yaml/linux39/case5# vim deploy_nfs2.yml 

#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-site2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ng-deploy-82
  template:
    metadata:
      labels:
        app: ng-deploy-82
    spec:
      containers:
      - name: ng-deploy-82
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/share/nginx/html/mysite
          name: my-nfs-volume
      volumes:
      - name: my-nfs-volume
        nfs:
          server: 172.20.10.22
          path: /data/k8sdata

---
apiVersion: v1
kind: Service
metadata:
  name: ng-deploy-82
spec:
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30032 #对外暴露访问端口
    protocol: TCP
  type: NodePort
  selector:
    app: ng-deploy-82

root@master-1:/opt/k8s-data/yaml/linux39/case5# kubectl apply -f deploy_nfs2.yml 
deployment.apps/nginx-deployment-site2 created
service/ng-deploy-81 created
root@master-1:/opt/k8s-data/yaml/linux39/case5# kubectl get pod 
NAME                                      READY   STATUS    RESTARTS   AGE
net-test1-5fcc69db59-jz944                1/1     Running   1          4d8h
net-test1-5fcc69db59-wzlmg                1/1     Running   2          4d8h
net-test1-5fcc69db59-xthfd                1/1     Running   2          4d8h
nginx-deployment-574b87c764-9m59f         1/1     Running   1          3d2h
nginx-deployment-site2-659498cf9c-8cth6   1/1     Running   0          11s
tomcat-deployment-7cd955f48c-lthk2        1/1     Running   1          3d2h


root@master-1:/opt/k8s-data/yaml/linux39/case5# kubectl exec -it nginx-deployment-site2-659498cf9c-8cth6 bash
root@nginx-deployment-site2-659498cf9c-8cth6:/# df -TH
Filesystem                 Type     Size  Used Avail Use% Mounted on
overlay                    overlay   98G  4.3G   89G   5% /
tmpfs                      tmpfs     68M     0   68M   0% /dev
tmpfs                      tmpfs    1.0G     0  1.0G   0% /sys/fs/cgroup
/dev/sda1                  ext4      98G  4.3G   89G   5% /etc/hosts
shm                        tmpfs     68M     0   68M   0% /dev/shm
172.20.10.22:/data/k8sdata nfs4      49G   55M   47G   1% /usr/share/nginx/html/mysite
tmpfs                      tmpfs    1.0G   13k  1.0G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                      tmpfs    1.0G     0  1.0G   0% /proc/acpi
tmpfs                      tmpfs    1.0G     0  1.0G   0% /proc/scsi
tmpfs                      tmpfs    1.0G     0  1.0G   0% /sys/firmware

K8S学习--Kubeadm-5-资源管理核心概念_第14张图片
实现了,一个nfs能被多个pod同时挂载,从而数据共享

在一个pod里面同时挂载多个NFS服务,实现pod里面有多个数据源,类似服务的多个站点数据区分

root@HA-server1:/data/k8sdata# mkdir /data/linux39

root@HA-server1:/data/k8sdata# vim /etc/exports #共享多个nfs
/data/k8sdata *(rw,no_root_squash)

/data/linux39 *(rw,no_root_squash)

root@HA-server1:/data/k8sdata# systemctl restart nfs-server.service 

node节点上查看是否共享成功

root@Node-3:~# showmount -e 172.20.10.22
Export list for 172.20.10.22:
/data/linux39 *
/data/k8sdata *

#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ng-deploy-80
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/share/nginx/html/mysite #对应/data/k8sdata目录挂载
          name: my-nfs-volume #区分挂载哪个nfs
        - mountPath: /data/nginx/html #对应 /data/linux39目录挂载
          name: linux39-nfs-volume  #区分挂载哪个nfs
      volumes:
      - name: my-nfs-volume
        nfs:
          server: 172.20.10.22
          path: /data/k8sdata
      - name: linux39-nfs-volume
        nfs:
          server: 172.20.10.22
          path: /data/linux39

---
apiVersion: v1
kind: Service
metadata:
  name: ng-deploy-80
spec:
  ports:
  - name: http
    port: 81
    targetPort: 80
    nodePort: 30016
    protocol: TCP
 
 root@master-1:/opt/k8s-data/yaml/linux39/case5# kubectl apply -f deploy_nfs.yml 
deployment.apps/nginx-deployment created
service/ng-deploy-80 created

oot@master-1:/opt/k8s-data/yaml/linux39/case5# kubectl exec -it nginx-deployment-79bf555474-tvgx5 bash
root@nginx-deployment-79bf555474-tvgx5:/# df -TH
Filesystem                 Type     Size  Used Avail Use% Mounted on
overlay                    overlay   98G  4.2G   89G   5% /
tmpfs                      tmpfs     68M     0   68M   0% /dev
tmpfs                      tmpfs    1.0G     0  1.0G   0% /sys/fs/cgroup
/dev/sda1                  ext4      98G  4.2G   89G   5% /etc/hosts
shm                        tmpfs     68M     0   68M   0% /dev/shm
172.20.10.22:/data/linux39 nfs4      49G   55M   47G   1% /data/nginx/html
172.20.10.22:/data/k8sdata nfs4      49G   55M   47G   1% /usr/share/nginx/html/mysite
tmpfs                      tmpfs    1.0G   13k  1.0G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                      tmpfs    1.0G     0  1.0G   0% /proc/acpi
tmpfs                      tmpfs    1.0G     0  1.0G   0% /proc/scsi
tmpfs                      tmpfs    1.0G     0  1.0G   0% /sys/firmware
      
                                             

K8S学习--Kubeadm-5-资源管理核心概念_第15张图片
NFS服务挂载的时候,不仅仅给pod节点pod网段共享目录的权限,也要给宿主机网段权限,不然挂载报错:
授权范围得注意 而且不是用mount去挂载

在这里插入图片描述
或者:

root@HA-server1:/data/k8sdata# vim /etc/exports 
/data/k8sdata 10.10.0.0/16 172.20.10.0/24(rw,no_root_squash) #用空格隔开
/data/linux39 10.10.0.0/16 172.20.10.0/24(rw,no_root_squash)

CASE6: configmap

https://kubernetes.io/zh/docs/concepts/storage/volumes/#configmap # configmap

configmap资源提供了向 Pod 注入配置数据的方法。 ConfigMap 对象中存储的数据可以被 configMap 类型的卷引用,然后被应用到 Pod 中运行的容器化应用。

配置信息大部分放到镜像里面 如果同一些配置信息给多个pod复用 可以用configmap

root@master-1:/opt/k8s-data/yaml/linux39/case6# vim  deploy_configmap.yml 

apiVersion: v1
kind: ConfigMap     #类型是configmap
metadata:
  name: nginx-config #通过这个名称来调用
data:
 default: |               # default一个key的名称 下面为定义的服务内容
    server {
       listen       80;
       server_name  www.mysite.com; 
       index        index.html;

       location / {
           root /data/nginx/html;
           if (!-e $request_filename) {
               rewrite ^/(.*) /index.html last;
           }
       }
    }


---
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ng-deploy-80
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /data/nginx/html
          name: nginx-static-dir
        - name: nginx-config       #调用nginx-config 这个的类型是 configMap
          mountPath:  /etc/nginx/conf.d
      volumes:
      - name: nginx-static-dir
        hostPath:
          path: /data/nginx/linux39
      - name: nginx-config
        configMap:
          name: nginx-config
          items:
             - key: default  #key 调用最前面的default
               path: mysite.conf #挂载容器的路径 结合起来就是 /etc/nginx/conf.d/mysite.conf
---
apiVersion: v1
kind: Service
metadata:
  name: ng-deploy-80
spec:
  ports:
  - name: http
    port: 81
    targetPort: 80
    nodePort: 30019 #对外暴露访问端口
    protocol: TCP
  type: NodePort
  selector:
    app: ng-deploy-80                         
root@master-1:/opt/k8s-data/yaml/linux39/case6# kubectl apply -f deploy_configmap.yml 
configmap/nginx-config created
deployment.apps/nginx-deployment created
service/ng-deploy-80 created

root@master-1:/opt/k8s-data/yaml/linux39/case6# kubectl get pod 
NAME                                 READY   STATUS    RESTARTS   AGE
net-test1-5fcc69db59-jz944           1/1     Running   1          4d16h
net-test1-5fcc69db59-wzlmg           1/1     Running   2          4d16h
net-test1-5fcc69db59-xthfd           1/1     Running   2          4d16h
nginx-deployment-8c449b55f-c5pkn     1/1     Running   0          13s
tomcat-deployment-7cd955f48c-lthk2   1/1     Running   1          3d10h
root@master-1:/opt/k8s-data/yaml/linux39/case6# kubectl get service
NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes              ClusterIP   192.168.0.1      <none>        443/TCP        4d18h
magedu-nginx-service    NodePort    192.168.9.132    <none>        80:30004/TCP   3d12h
magedu-tomcat-service   NodePort    192.168.14.155   <none>        80:31849/TCP   3d10h
ng-deploy-80            NodePort    192.168.3.122    <none>        81:30019/TCP   24s
ng-deploy-81            NodePort    192.168.9.29     <none>        80:30015/TCP   8h

root@master-1:/opt/k8s-data/yaml/linux39/case6# kubectl exec -it nginx-deployment-8c449b55f-c5pkn bash
root@nginx-deployment-8c449b55f-c5pkn:/# cat /etc/nginx/conf.d/mysite.conf  #查看配置信息
server {
   listen       80;
   server_name  www.mysite.com;
   index        index.html;

   location / {
       root /data/nginx/html;
       if (!-e $request_filename) {
           rewrite ^/(.*) /index.html last;
       }
   }
}

K8S学习--Kubeadm-5-资源管理核心概念_第16张图片
在node3中创建首页文件,看是否能够调用configmap

root@Node-3:~# cd /data/nginx/linux39/
root@Node-3:/data/nginx/linux39# vim index.html
root@Node-3:/data/nginx/linux39# cat index.html
configMap test page
root@Node-3:/data/nginx/linux39# 

访问node3的网页
K8S学习--Kubeadm-5-资源管理核心概念_第17张图片

DaemonSet

https://kubernetes.io/zh/docs/concepts/workloads/controllers/daemonset/

DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。

DaemonSet会在当前k8s集群中的所有node创建相同的node,主要用于在所有node执行相同的操作的场景
1.日志收集
2.Prometheus
3.flannel

root@master-1:/opt/k8s-data/yaml/linux39# vim Daemonset.yml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:
      # this toleration is to have the daemonset runnable on master nodes
      # remove it if your masters can't run pods
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log  #把/var/log挂载到pod里面
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers #把/var/lib/docker/containers挂载到pod里面

root@master-1:/opt/k8s-data/yaml/linux39# kubectl apply -f Daemonset.yml 
daemonset.apps/fluentd-elasticsearch created
root@master-1:/opt/k8s-data/yaml/linux39# kubectl get pod -n kube-system
NAME                               READY   STATUS              RESTARTS   AGE
coredns-7f9c544f75-dd7gc           1/1     Running             4          4d13h
coredns-7f9c544f75-z5pds           1/1     Running             0          4d13h
etcd-master-1                      1/1     Running             26         4d19h
etcd-master-2                      1/1     Running             24         4d18h
etcd-master-3                      1/1     Running             20         4d18h
fluentd-elasticsearch-26jsw        0/1     ContainerCreating   0          29s #正在创建
fluentd-elasticsearch-8b2bl        0/1     ContainerCreating   0          29s
fluentd-elasticsearch-gx6c4        0/1     ContainerCreating   0          29s
fluentd-elasticsearch-hb4hc        0/1     ContainerCreating   0          29s
fluentd-elasticsearch-hpjwd        0/1     ContainerCreating   0          29s
fluentd-elasticsearch-qttwk        0/1     ContainerCreating   0          29s

可以看到集群中所有的master和所有的node节点中都创建了相同的一个pod 可以用于相同资源的获取调用。

你可能感兴趣的:(k8s,k8s资源调度实验,kubernetes,K8S资源管理)