Kubernetes
产生背景
一个利用运行所须要依赖的环境资源
CPU 执行具体的指令内存 保留执行代码和长期变量磁盘 保留利用须要读取和写入的文件网卡 传输网络数据供给用拜访内部资源或被拜访...
利用部署
过来形式: 部署在一台机器上,以一个过程的形式运行古代形式: 一个应用服务会用多个实例去撑持,以实现流量均摊和高可用云原生时代: 主动依据流量拜访和机器资源 治理应用服务 多实例载
要解决的问题
资源调度, 即一个利用要部署在一群机器外面的那些机器上依据机器的残余资源来调度, 即CPU 内存 利用拜访规定 域名 域名转发规定
外围定义
- 一个用来治理 跨机器的容器化的利用,提供利用部署、运维、扩大等性能的开源零碎
- 容器化利用能够了解为一个镜像,蕴含应用服务自身和其依赖的环境资源,跨机器部署时可无需再反复下依赖的过程
- 基于容器化技术,k8s主动对应用服务进行 扩、缩容以实现 资源服务 的 最大化 治理调度
根本架构
master
零碎的大脑外围服务: Kube-APIServer,Kube-Scheduler,Kube-Controller-ManagerKube-APIServer次要提供了 Kubernetes 零碎对外的接口,接口的模式是基于 HTTP 协定的。因为大部分状况下,咱们会在部署 Kubernetes 的时候采纳 HTTPS 的部署形式,所以这个接口真正应用的时候所采纳的就是 HTTPS 协定。咱们整个课程的大部分内容都是间接和这个服务进行交互。通过 Kubernetes 的 Go SDK 向这个服务发送申请进行资源的操作Kube-Scheduler如果说 Master 所在的机器是从内部看 Kubernetes 时的大脑,那么 Scheduler 服务就是从外部看 Kubernetes 时的大脑。咱们刚刚说到的对于利用部署相干的细节都是由 Scheduler 服务来思考的。例如:对于利用 CPU 和内存资源的需要来说,Scheduler 须要综合考量整体可用 CPU 和内存资源的状况以决定将利用部署到哪些 Nodes 下面;或者是对于软件或者硬件层面的策略限度的考量(比方某些利用须要 GPU 资源);另外还有一些诸如 CPU 亲和性相干的考量等等Kube-Controller-Manager刚刚说过,当咱们深刻到 Kubernetes 架构外部看时,Scheduler 服务是整个 Kubernetes 的大脑,那么 Controller-Manager 就是具体的执行者。这个 Controller-Manager 是一组 Controller 的汇合。这些 Controller 的次要工作是让 Kubernetes 的零碎状态达到冀望的零碎状态。所谓冀望的零碎状态,举个例子如冀望的利用所需的 CPU 配额和限额或者是实例部署的数量等等。当你发送 API 申请去创立、批改、删除利用资源的时候,所做的操作就是设置一个利用部署的期望值。而这些 Controller 就是一直地查看这些部署的实时状态让零碎达到利用所冀望的状态。在目前的 Kubernetes 的版本中,这组 Controller 别离为 Replication Controller,Endpoints Controller,Namespace Controller 和 ServiceAccount Controller。别离负责:利用数量的扩容和伸缩;集群服务和后端利用所在 Pod 之间的动静关系的保护;命名空间的治理和 ServiceAccount 的治理
Nodes
Kubelet次要工作是确保部署在下面的利用失常运行。这个失常运行也就是下面所说的让零碎达到冀望的状态。为了可能让零碎达到这个状态,那必定得从 Master 获取冀望的状态,而后再定时上报以后本人的状态,这样零碎能力理解全局的状况。Kubelet 和 Master 的交互也是通过 APIServer 进行的。Kubelet 通过一个称为 cAdvisor 的容器资源剖析工具来获取 Node 和容器的数据进行上报Kube-Proxy运行在 Nodes 下面的利用提供拜访的通明代理服务以及负载平衡服务。从原理上来讲,利用是运行在咱们上面会介绍到的 Pod 外面的。一个利用如果有多个实例,其实就是会有多个 Pod。Kubernetes 零碎提供了一个称之为 Service 的对象来为这组利用的 Pod 提供集群层面的拜访入口。那么当一个申请达到 Service 的时候,如何决定将申请转发给哪个 Pod 外面的服务去解决呢?当扩容或者缩容的时候,这种转发的策略如何随之发生变化呢?这些都是通过 Kube-Proxy 来实现的,Kube-Proxy 为 Service 提供了申请转发和负载平衡
根本资源
# kind启动k8s集群kind create cluster --name kubernetes --config <your_config_file> # 查看以后零碎下存在的命名空间kubectl get namespace # orkubectl get ns# 查看以后零碎下指定命名空间kubectl get ns <ns_name># 以json/yaml格局输入kubectl get ns <ns_name> -o jsonkubectl get ns <ns_name> -o yaml# 更敌对的形式kubectl describe ns <ns_name># 查看所有命名空间外面的Pod(一组容器的汇合,蕴含须要运行的应用服务)kubectl get pod --all-namespaces# or 指定命名空间kubectl get pod --namespaces <spec_ns># 查看所有命名空间外面的Service(帮助Pod对外提供TCP/UDP拜访服务)kubectl get svc --all-namespaces# or 指定命名空间kubectl get svc --namespaces <spec_ns># 查看某命名空间下的deployment(帮助Pod调度)kubectl get deployment <your_deployment> -n <your_ns># 查看secret(存储敏感信息的资源,诸如用户名明码、TOKEN、SSH KEYS、HTTPS证书)kubectl get secret# or 指定secretkuebcgtl get secret <your_secret># 查看ingress(提供OSI七层数据转发至Service资源对象的资源对象)kubectl get ingress# 获取所有命名空间下的ServiceAccountkubectl get sa --all-namespaces# 创立本人的sakubectl create sa <your_sa>
受权ServiceAccount拜访K8s资源
k8s的访问控制模型
设置鉴权
# 1. 设置一个账号鉴权信息# 创立sa$ kubectl create sa demo-admin serviceaccount/demo-admin created# kubectl config set-credentials <your_sa> --token <TokenOfSecret>## <your_sa>: demo-admin$ kubectl describe sa demo-admin Name: demo-adminNamespace: defaultLabels: <none>Annotations: <none>Image pull secrets: <none>Mountable secrets: demo-admin-token-w67mgTokens: demo-admin-token-w67mgEvents: <none>## 查看demo-admin对应的Tokens$ kubectl describe secret demo-admin-token-w67mg [15:38:43]Name: demo-admin-token-w67mgNamespace: defaultLabels: <none>Annotations: kubernetes.io/service-account.name: demo-admin kubernetes.io/service-account.uid: c096777d-6ce8-454e-bd9d-0096d2149fa0Type: kubernetes.io/service-account-tokenData====ca.crt: 1025 bytesnamespace: 7 bytestoken: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InNoaXlhbmxvdS1hZG1pbi10b2tlbi13NjdtZyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJzaGl5YW5sb3UtYWRtaW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJjMDk2Nzc3ZC02Y2U4LTQ1NGUtYmQ5ZC0wMDk2ZDIxNDlmYTAiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDpzaGl5YW5sb3UtYWRtaW4ifQ.KM5SNVdIcz0YY3WkYM_B8FQYmwMfMpEY__Y4mo9qKG-0y70elty8m7JDA4-bhmPrUw7CYt_5ah1z8cEKh27rBPWqoBNR2W61QX5pylAW-5uiRAEBi-K_-Rx-C1B2Rwwi-vLH71nF5x9SWt7L61VtWfVk5r6MLo_B8UjXNHSkZZ5j2wRFWLw0e_Jv4Qh9xibhr2ldfK-NWJUJugFG2GczdZo5foS0BOgZOmYLX9v8ixCc1Tz2miqcCPto6YfTLakQ1wbA2Ae_psOt_uKPkx7IYdxXury9tRCaB5_OxkpXWQ8FTEGgXiP8iq4fTFh8fUGg3iqOn_j9VfUYqy8Ci4x9Pw## 设置账号鉴权$ kubectl config set-credentials demo-admin --token eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InNoaXlhbmxvdS1hZG1pbi10b2tlbi13NjdtZyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJzaGl5YW5sb3UtYWRtaW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJjMDk2Nzc3ZC02Y2U4LTQ1NGUtYmQ5ZC0wMDk2ZDIxNDlmYTAiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDpzaGl5YW5sb3UtYWRtaW4ifQ.KM5SNVdIcz0YY3WkYM_B8FQYmwMfMpEY__Y4mo9qKG-0y70elty8m7JDA4-bhmPrUw7CYt_5ah1z8cEKh27rBPWqoBNR2W61QX5pylAW-5uiRAEBi-K_-Rx-C1B2Rwwi-vLH71nF5x9SWt7L61VtWfVk5r6MLo_B8UjXNHSkZZ5j2wRFWLw0e_Jv4Qh9xibhr2ldfK-NWJUJugFG2GczdZo5foS0BOgZOmYLX9v8ixCc1Tz2miqcCPto6YfTLakQ1wbA2Ae_psOt_uKPkx7IYdxXury9tRCaB5_OxkpXWQ8FTEGgXiP8iq4fTFh8fUGg3iqOn_j9VfUYqy8Ci4x9PwUser "demo-admin" set.
# 2. 设置集群的访问信息# 集群的访问信息就是指 API 服务的地址和服务端的证书# 应用上面的命令将 Kubernetes 服务端证书保留到 /home/demo/ca.crt 文件中$ docker exec kubernetes-control-plane cat /etc/kubernetes/pki/ca.crt | tee /home/demo/ca.crt$ kubectl cluster-info Kubernetes master is running at https://127.0.0.1:43522KubeDNS is running at https://127.0.0.1:43522/api/v1/namespaces/kube-system/services/kube-dns:dns/proxyTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.$ kubectl config set-cluster k8s-learning \ > --server https://127.0.0.1:43522 \> --certificate-authority /home/demo/ca.crt \> --embed-certs=trueCluster "k8s-learning" set.# 3. 创立一个 Context,把集群信息和鉴权信息绑定在一起$ kubectl config set-context k8s-learning-ctx \ > --cluster k8s-learning \> --user demo-adminContext "k8s-learning-ctx" created.# 4. 应用这个创立的 Context$ kubectl config use-context k8s-learning-ctx Switched to context "k8s-learning-ctx".# 查看pod资源报错,不慌,因为还没有受权$ kubectl get pods Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:demo-admin" cannot list resource "pods" in API group "" in the namespace "default"# 先切回到 kubectl 默认的无鉴权的拜访模式下$ kubectl config use-context kind-kubernetes
受权简介
kubernetes资源次要分两类: 操作系统层面和命名空间层面依据拜访资源的类别,拜访角色也相应分成ClusterRole(操作系统层面)Role(命名空间层面)命名空间层面的资源操作包含:create (创立资源)update (更新资源)delete (删除资源)patch (批改资源的字段)get (获取资源)list (获取资源列表)watch (监听资源)
根本步骤
创立ServiceAccount创立ClusterRole或Role,并相应指定资源操作创立ClusterRoleBinding或RoleBinding,而后绑定ServiceAccount
演示
# 1.创立一个 Role,在这个 Role 中授予操作相干资源的权限$ kubectl create role demo-admin-role \--resource pod,service,deployment,secret,ingress \--verb create,update,delete,patch,get,list,watch# 2.创立一个 RoleBinding,将这个 Role 和 ServiceAccount 绑定在一起kubectl create rolebinding demo-admin-role-binding \--role demo-admin-role \--serviceaccount default:shiyanlou-admin# 3.切到k8s-learning-ctxkubectl config use-context k8s-learning-ctx