k8s入门

k8s架构简介

k8s集群基本分为2类节点:

  • master node :主控节点(主要负责调度,不实际运行业务)
  • worker node : 工作节点

master节点的组件:(可以理解为程序)

  • apiserver :接收客户端操作k8s的指令
  • schduler (调度) [ˈskɛdʒʊlər]从多个worker node节点的组件中通过算法选举一个来启动服务
  • controller manager:向worker nodekubectl发送指令

node节点的组件:

  • kubelet : 向docker发送指令管理docker容器的
  • kubeproxy: 管理docker容器网络的

etcd:

  • k8s的数据库
  • 用来注册节点、节点的ip信息等、服务、记录、账户、dns解析扥等

pod:

  • 最小部署单元
  • 一组(1个或者多个)docker容器的集合

controllers:(控制器,用来启动、停止、删除Pod)

  • Deployment:无状态应用部署
  • Job: 普通任务、
  • CronJob:定时任务
  • DaemonSet 有状态

service:

  • 防止pod失联
  • 定义一组pod访问策略
  • 类似于VIP的概念,统一入口

label:

  • 一组pod有一个统一的label
  • service是通过label和一组pod进行关联

namesapce:(名称空间)

  • 实现业务隔离,禁止不同pod互相访问
  • 用来隔离pod运行环境,默认所有pod是可以互相访问的

k8s入门_第1张图片
etcd集群都是奇数个


k8s安装

kubeadm安装推荐比官方详细,适用于学习
https://kuboard.cn/install/install-dashboard.html

常用命令

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
bgpconfigurations                              crd.projectcalico.org          false        BGPConfiguration
clusterinformations                            crd.projectcalico.org          false        ClusterInformation
felixconfigurations                            crd.projectcalico.org          false        FelixConfiguration
globalnetworkpolicies                          crd.projectcalico.org          false        GlobalNetworkPolicy
globalnetworksets                              crd.projectcalico.org          false        GlobalNetworkSet
hostendpoints                                  crd.projectcalico.org          false        HostEndpoint
ippools                                        crd.projectcalico.org          false        IPPool
networkpolicies                                crd.projectcalico.org          true         NetworkPolicy
events                            ev           events.k8s.io                  true         Event
daemonsets                        ds           extensions                     true         DaemonSet
deployments                       deploy       extensions                     true         Deployment
ingresses                         ing          extensions                     true         Ingress
networkpolicies                   netpol       extensions                     true         NetworkPolicy
podsecuritypolicies               psp          extensions                     false        PodSecurityPolicy
replicasets                       rs           extensions                     true         ReplicaSet
nodes                                          metrics.k8s.io                 false        NodeMetrics
pods                                           metrics.k8s.io                 true         PodMetrics
networkpolicies                   netpol       networking.k8s.io              true         NetworkPolicy
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
storageclasses                    sc           storage.k8s.io                 false        StorageClass
volumeattachments                              storage.k8s.io                 false        VolumeAttachment


kubectl get po/svc/cm/deploy: 查看容器
kubectl describe po name :查看详情 
kubectl delete po name :删除资源
-o wide : 多显示几列详细信息
-A: 所有命名空间
-n name : 指定命名空间(default可以不带此参数)
kubectl apply/create -f aaa.yaml : 执行yml文件
kubectl exec 容器名称 -it -- /bin/bash : 进入容器


k8s通过控制器(Controller)创建容器组(Pod)
k8s入门_第2张图片


apply 通过yaml创建资源对象

kubectl apply -f nginx-deployment.yaml

创建deployment的创建pod

apiVersion: apps/v1	#与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment	#该配置的资源类型,我们使用的是 Deployment 还有Pod Service等
metadata:	        #译名为元数据,即 Deployment 的一些基本属性和信息
  name: nginx-deployment	#Deployment 的名称
  labels:	    #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
    app: nginx	#为该Deployment设置key为app,value为nginx的标签
spec:	        #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
  replicas: 1	#使用该Deployment创建一个应用程序实例
  selector:	    #标签选择器,与上面的标签共同作用,目前不需要理解
    matchLabels: #选择包含标签app:nginx的资源
      app: nginx
  template:	    #这是选择或创建的Pod的模板
    metadata:	#Pod的元数据
      labels:	#Pod的标签,上面的selector即选择包含标签app:nginx的Pod
        app: nginx
    spec:	    #期望Pod实现的功能(即在pod中部署)
      containers:	#生成container,与docker中的container是同一种
      - name: nginx	#container的名称
        image: nginx:1.7.9	#使用镜像nginx:1.7.9创建container,该container默认80端口可访问
        ports:
        - containerPort: 80

再通过service暴露pod的服务

kubectl apply -f nginx-service.yaml
# 创建文件 nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service	#Service 的名称
  labels:     	#Service 自己的标签
    app: nginx	#为该 Service 设置 key 为 app,value 为 nginx 的标签
spec:	    #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
  selector:	    #标签选择器
    app: nginx	#选择包含标签 app:nginx 的 Pod
  ports:
  - name: nginx-port	#端口的名字
    protocol: TCP	    #协议类型 TCP/UDP
    port: 80	        #集群内的其他容器组可通过 80 端口访问 Service
    nodePort: 32600   #通过任意节点的 32600 端口访问 Service
    targetPort: 80	#将请求转发到匹配 Pod 的 80 端口
  type: NodePort	#Serive的类型,ClusterIP/NodePort/LoaderBalancer
 #clusterIP: None #无头服务

service简写svc是用于暴露Pod的基于4层负载均衡,由于Pod的ip地址会随时改变,所以需要通过创建service一个抽象接口来进行访问。

ClusterIP:只能在集群内部访问,类似于vip,进行轮询访问,或者是{servicename}.{namespace}
NodePort: 外部通过node节点使用ip:port访问,通过kube-proxy暴露监听端口
LoaderBalancer:通过负载均衡器,一般是云厂商提供,收费功能。
None: headless service也成为无头服务,statefulset的访问方式{pod-name}.{service-name}.{namespace}.svc.cluster.local,deployment的访问方式{service-name}.{namespace}.svc.cluster.local


通过ingress发布web服务,nginx-ingress理解为一个特定修改版的Nginx,用来发布nginx里面的服务,可以做4层/7层的负载均衡

需要先安装nginx-ingress

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress-for-nginx  # Ingress 的名字,仅用于标识
spec:
  rules:                      # Ingress 中定义 L7 路由规则
  - host: test.cn   # 根据 virtual hostname 进行路由(请使用您自己的域名)
    http:
      paths:                  # 按路径进行路由
      - path: /
        backend:
          serviceName: nginx-service  # 指定后端的 Service 为之前创建的 nginx-service
          servicePort: 80

nginx-ingress的配置
https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md


创建configMap并以volumes挂载配置文件

# vim my-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
data:
  test.json: |
   {
   "user":"lzh",
   "age":"25",
   "sexy":"man"     
   }

#  vim busybox-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox-dep
  labels: 
    app: busybox
spec:
  replicas: 1
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec: 
      containers:
      - name: busybox
        image: busybox:latest
        imagePullPolicy: IfNotPresent
        command: ["sleep"]
        args: ["1000"]
        volumeMounts:
          - name: config-volume
            mountPath: /etc/config    
      volumes:
        - name: config-volume
          configMap: #通过volumes的形式挂载configmap,也可以通过hostPath的方式挂载宿主机目录
            name: env-config 



创建PV和PVC

  • 创建PV
[root@coreddns volume]# cat pv-nfs.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 2Gi #一个大概多少G都行,并不是实际意义上的nfs控件
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany #访问模式
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: slow # 自定义存储类字符串
  nfs:
    path: /data
    server: 192.168.123.250

  • 创建PVC并绑定PV
[root@coreddns volume]# cat pvc-nginx.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
  namespace: default 
spec:
  storageClassName: slow #匹配PV的存储类
  accessModes: ["ReadWriteMany"] 
  resources:
    requests:
      storage: 1Gi #匹配PV的存储控件

  • 控制器挂载PVC到容器中
[root@coreddns k8s]# cat nginx-deployment.yaml 
apiVersion: apps/v1     #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment        #该配置的类型,我们使用的是 Deployment
metadata:               #译名为元数据,即 Deployment 的一些基本属性和信息
  name: nginx-deployment        #Deployment 的名称
  labels:           #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
    app: nginx  #为该Deployment设置key为app,value为nginx的标签
spec:           #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
  replicas: 1   #使用该Deployment创建一个应用程序实例
  selector:         #标签选择器,与上面的标签共同作用,目前不需要理解
    matchLabels: #选择包含标签app:nginx的资源
      app: nginx
  template:         #这是选择或创建的Pod的模板
    metadata:   #Pod的元数据
      labels:   #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
        app: nginx
    spec:           #期望Pod实现的功能(即在pod中部署)
      containers:       #生成container,与docker中的container是同一种
      - name: nginx     #container的名称
        image: nginx:1.8      #使用镜像nginx:1.7.9创建container,该container默认80端口可访问
        volumeMounts:         #容器内挂载卷 
          - name: nfs-pvc     #匹配卷
            mountPath: /usr/share/nginx/html    
      volumes:           
      - name: nfs-pvc #创建卷
        persistentVolumeClaim:
          claimName: nginx-pvc   #申请PVC卷

你可能感兴趣的:(Linux运维基础)