k8s-and-istio的学习

Interactive Tutorial - Creating a Cluster | Kubernetes

 一、K8s:

minikube start

kubectl run kubernetes-bootcamp --image=docker.io/jocatalin/kubernetes-bootcamp:v1 --port=8080

kubectl get pods

kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

kubectl get services:查看pod和节点的的端口映射;

curl minikube:30939

kubectl get deployments # 查看应用副本数;

kubectl scale deployments/kubernetes-bootcamp --replicas=3

kubectl get pods # 查看pod数对应副本数;

kubectl scale deployments/kubernetes-bootcamp --replicas=2

kubectl set image  deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

k8s-and-istio的学习_第1张图片

kubectl rollout undo deployments/kubernetes-bootcamp

k8s-and-istio的学习_第2张图片

kubectl get services# 查看应用

k8s-and-istio的学习_第3张图片

kubectl get deployment --all-namespaces # 查看所有工作空间的应用;

kubectl get deployment 应用名Name -n 工作空间 #查看该应用的副本数;工作空间对应k8s的命名空间NAMESPACE,应用名-部署组名-部署组ID对应k8s的Name;

k8s功能:

1.k8s功能:通过控制器自动部署应用,和应用的回滚(版本不对的时候,快速版本回退)kubernetes入门到实战【基础+进阶篇+容器基建+基于1.18版+2020出品】_哔哩哔哩_bilibili;kubernetes入门与实战【基础+进阶篇+容器基建+2020出品】【共119课时】_K8s课程-51CTO学堂

2.应用部署好之后呐,我们有多个容器;这些容器如何进行对外访问呢?

解:我们需要有个服务发现和负载均衡;即在容器前面加个负载均衡;

服务发现:一个应用有3个容器,即3个副本,比如增加了个副本之后,这个副本会自动的去注册中心注册进去;注册之后呐,负载均衡就能够识别到该副本了。

3.容器横向扩容:当业务不够时,可以加更多的容器进来,或者说去做动态的弹性伸缩;基于CPU和内存使用率,可动态的横向增加CPU,或增加容器或减少容器;

4.健康检查功能:容器运行中可能会出错,包含容器错误,或node错误;k8s能够帮你做容器的健康检查,还有高可用性。当某容器出现异常时,k8s会从负责均衡中,将其剔除掉;保证业务正常的运行;

5.跑批处理的任务:即有一次性的任务可以跟k8s中去跑;

6.容器和配置分离:通过secret和configuration management ,应用程序和配置文件做分离,从而实现配置文件做个自定义;key,把用户名和密码,比较敏感的信息保存到key中,从而实现,敏感信息和应用程序分离;

k8s架构:Kubernetes

1.k8s node节点:负责容器的真正的运行;

2.k8s控制层面:负责k8s集群管理;另外跟云厂商进行集成(包含,公有云、私有云)

3.控制层面包含5个组件:Kubernetes Components | Kubernetes

  • kube-api-server,集群整体的入口;功能1,把所有API都暴露给外户用户进行访问;用户要访问k8s,所有请求都需要api-server来进行接收;功能2,进行认证和授权,用户在访问时,APIServer 接收到了请求,要看用户具有哪些权限进行访问哪些东西;功能3,负责,或别的控制组件跟APIServer交互,然后apiserver替其跟k8s的数据库etcd进行数据交互;
  • etcd,主要是完成集群状态数据的数据持久化,功能1,是持久化好可用,key value数据库;主要存储k8s集群状态的数据,包含:node节点,主节点,以及要运行的容器调度到了哪些节点,等等状态信息都是保存在etcd中;功能2,etcd有watch功能;
  • kube-scheduler调度器:api server接收用户请求,创建容器要求4核8G,容器到底调度到那些节点上去,选择那个节点合理,由kube-scheduler来做,做两个事情,一是过滤,满足条件的node筛选出来,然后对满足条件的节点进行排序,然后把最优的节点运行我们的容器;功能2,支持灵活的调度策略,包括资源请求、硬件软件策略、亲和力和反亲和力特性
  • kube-controller-manager
    控制器:k8s中提供了非常多的控制器,它的任务和工作负载,都是通过控制器来进行控制的;

  • cloud-controller-manager
    :云控制管理器;

4.node节点指的是工作节点;工作节点主要是运行自己的容器;node节点主要包含3部分内容:

  • container runtime:目的是真正的运行容器;k8s中支持多种container runtime ,包含docker等等多种容器运行时,docker能够负责容器生命周期的管理,包含容器创建,删除等等;只要满足容器运行时的容器管理,就可以接入k8s,即符合管理容器的规范即可。
  • kubelet:管理container runtime,即管理容器的;相当于运行在worker节点上的一个agent,agent能够把自己的状态上报给k8s master ,自己是否正常;k8s通过kubelet来判断工作节点的状态,若工作节点出现了不正常的时候,kubelet需要迁移其上的容器,功能1,确保容器是一个健康的状态;功能2,负责跟container runtime进行交互,完成容器管理工作;比如,要创建一个容器,kubelet跟不同容器的运行时进行交互,完成容器的创建,以及资源的管理。
  • kube-proxy:一个应用部署了多个容器,容器的网络如何暴露出去呐,应用如何暴露给外部访问?需要一个负载均衡器。负载均衡规则的设定,通过kube-proxy来去做的,proxy是一个service机制的实现。反向代理组件。反向代理提供到一个EIP,把EIP转发到后端的pod上(podIP或容器IP上)。

5.服务外部接入:通过ingress实现7层接入;

6.k8s社区:Graduated and incubating projects | Cloud Native Computing Foundation ,即要想学好k8s,需了解其中组件

7.编排引擎和应用程序的定义:其中helm,做容器的一个自动部署,通过helm在容器中安装业务;

8.envoy,可以理解为服务代理;

9.k8s环境的安装:Notes | Kubernetes

  • 生成环境中,最常用的安装方式kubeadm:Bootstrapping clusters with kubeadm | Kubernetes  (要求2核,4G)

10.设置主机名:hostnamectl set-hostname  node-1

11.k8s中端口用途:Installing kubeadm | Kubernetes

12.etcd有两个端口,一个是内部通信使用,另一个是外部访问使用;

13.Services端口,是用来暴露容器服务的;

14.kubeadm:初始化集群,自动化部署的工具;

15.kubelet:管理container runtime把容器创建出来;主要功能的启动容器;

16.kubectl:命令行工具,负责跟k8s进行交互的;

17.kube-proxy:完成service的网络构建,将容器中的应用,暴露给外部集群使用,需要借助kube-proxy来实现;

18.查看k8s的资源对象: kubectl api-resources

19.k8s中说api server是无状态的,是什么意思?

20.查看node信息:kubectl describe node 节点名字;可以看到该node的各种信息包含,可容纳的pod的个数等

21.pod不会单独使用,需要工作负载来控制,比如:Deployments等控制器组件;

22.container没有直接由k8s来管理,而是由pod来管理的;docker container list ;

23.k8s中应用叫Deployment,Deployment是应用中的一种,是部署无状态化应用的;

24.副本数在k8s中是pod;即Deployment中有多少个pod;应用中有多少个副本;

25.pod template展示的是pod的模板:

k8s-and-istio的学习_第4张图片

26.代表副本集:是由deployment-controller来创建的;

k8s-and-istio的学习_第5张图片

27.replicasets做副本复制的,管理pod的数量的;

28.创建个nginx应用kubectl create deployment app-demo --image=nginx:1.7.9 -n 工作空间名;

29.nginx应用有4个副本,外部如何访问nginx应用呐?情况1,访问clusterIP的形式,不可行,因为多个副本,不适用;情况2,容器可能根据业务的情况,横向的增加或者减少,所以访问clusterIP的形式是不可行的;情况3,当某node发生了异常,在该node上的pod会进行漂移,导致podIP地址发生变化;

方案:就是把该应用的所有副本当作是RS,然后在其上加个负载均衡器,然后负载均衡器有个VIP,最后直接访问这个VIP即可;通过负载均衡器来负载到后端的节点的容器上;负载均衡器能够自动探测到容器的变化,以及能够进行流量的分发,分发到后端不同的pod上;实现负载均衡效果;

k8s中的service可以理解成负载均衡器,service如何把pod拿到的呐?即是根据标签label,每个pod有个自己的label,负载均衡器就能够通过label-selector(标签选择器),选择到需要的标签;若某容器有变化,service通过健康检查探测到有变化,就会将其剔除;

service通过label-selector,将满足条件的pod加入到负载均衡器中去,并且是自动的;kubernetes入门到实战【基础+进阶篇+容器基建+基于1.18版+2020出品】_哔哩哔哩_bilibili

kubectl expose -h

kubectl expose deployment app-demo -n 命名空间--port=80 --protocol=TCP # --port是暴露的外部访问端口,--type可以不用指定,默认是clusterIP

service通过labels标签将Endpoints中的几个满足条件的容器IP地址锁定:转发到各个容器中;容器IP通过endpoints资源来管理的

k8s-and-istio的学习_第6张图片

k8s-and-istio的学习_第7张图片

service就是一个负载均衡;在k8s中实现负载均衡的一个机制;

30.nodeport方式:所有node节点上都会暴露出同一个端口出来;

变type类型ClusterIP为NodePort修改此处的类型:

kubectl edit service -n 命名空间 app-demo

k8s-and-istio的学习_第8张图片

此时访问应用就需要,curl node公网IP:nodeport端口   #即可访问通

31.loadbalancer主要是用在公有云场景下,借助公有云的外部负载均衡器,将应用请求转发到k8s中的pod上;

32.探索service是如何实现的呐?

通过构建不同iptables规则,来将入站请求转发给后端不同的pod上;

33.滚动更新过程中,借助负载均衡来保障业务不受影响;

更新镜像版本:kubectl set image -n 命名空间 deployment app-demo nginx=nginx:latest

监听滚动更新过程:

k8s-and-istio的学习_第9张图片

二、

istio的安装:https://istio.io/v1.6/docs/setup/getting-started/

Kubernetes 实践指南(Kubernetes Practice Guide):案例分享 - kubectl edit 或者 apply 报 SchemaError - 《Kubernetes 实践指南(Kubernetes Practice Guide)》 - 书栈网 · BookStack

中文的:Kubernetes(k8s)中文文档 安装和设置kubectl_Kubernetes中文社区

Kiali: 使用 Kiali 观察您的服务窗格-InfoQ

kubectl的参数:kubectl 概述 | Kubernetes

istio的版本:Release Istio 1.6.8 · istio/istio · GitHub

迈向极简主义 - Istio 1.6 发布:迈向极简主义 - Istio 1.6 发布 · Service Mesh|服务网格中文社区

三、k8s相关的学习链接:

配置对多集群的访问 | Kubernetes

k8s:查看配置文件的内容;kubectl config view;

kubectl config view --minify;# 查看到当前上下问关联的配置信息;

在k8s的master node上,查看所有工作空间的pod:kubectl get po --all-namespaces

各命令的使用:k8s集群运维篇–kubectl常用命令 - 云+社区 - 腾讯云

使用istio治理微服务入门:使用istio治理微服务入门 | Tony Bai

云原生社区:Pilot · Istio Handbook - Istio 服务网格进阶实战 by ServiceMesher(服务网格社区)

istiod:在 Istio 1.5 中,我们更改了 Istio 的打包方式,将控制平面功能合并为一个被称为 istiod 的二进制文件;只需启动单个 Pod,就可以启用一个包含了所有功能的 Istio 控制平面;https://istio.io/latest/zh/blog/2020/istiod/

istiod 将先前由 Pilot,Galley,Citadel 和 sidecar 注入器执行的功能统一为一个二进制文件;

istio官方文档:https://istio.io/latest/docs/setup/getting-started/

istio云原生社区:只要把网络层委托给 Istio,它就能帮你完成这一系列的功能。简单来说,Istio 就是一个提供了服务治理能力的服务网格;Istio 是什么 · Istio Handbook - Istio 服务网格进阶实战 by ServiceMesher(服务网格社区)

istio的pilot部分信息:绿色记忆:Istio Pilot与Envoy的交互机制解读;如何启动pilot discovery

istio中文官方文档:https://istio.io/latest/zh/docs/setup/getting-started/

四、k8s部署的四种方式:可看:30分钟部署一个Kubernetes集群【1.15版】_哔哩哔哩_bilibili

1.13版本kubeadm,可用于GA 生产环境;(初学者)

二进制部署企业中用的最多;(熟悉者)

kubectl 是客户端管理命令,管理k8s集群的;kubelet,是node的agent,给node上执行命令的;

kubeadm是来部署k8s集群的;

k8s和docker版本要兼容;

初始化master需要指定kube-proxy的IP和pod网络每个容器的IP及api-server的IP、镜像仓库地址、k8s版本;

拉镜像(api-server、kube-proxy等组件)

为etcd(k8s数据库)和api-server、proxy生成证书;

生成kubeconfig文件,用于启动其他组件;

启动控制面板通过静态pod的概念(及api-server 、schedule、controller-manager)

为了给node颁发证书引入了bootstrap-token概念;(避免人工搞)

部署k8s内部的Coredns和kube-proxy(负责网络的)

安装pod网络组件;

将node 加入集群中,master初始化的时候有生成带有token的命令;执行复制粘贴即可;

创建应用,然后给应用暴露如何通过外部访问,通过指定类型为NodePort类型,通过node的IP加端口即可访问应用;

五、Kubernetes的三种外部访问方式:NodePort、LoadBalancer 和 Ingress

Kubernetes的三种外部访问方式:NodePort、LoadBalancer 和 Ingress - DockOne.io

六、编译istio因为Makefile遇到的问题:

Linux拷贝命令cp的一点总结(附cannot overwrite directory xxx with non-directory)

Linux拷贝命令cp的一点总结(附cannot overwrite directory xxx with non-directory)_liaojunwu的博客-CSDN博客

七、kubectl apply -f .

等价于helm install -n

helm核心是:能集中管理yaml,以及能利用好模板,能给yaml中常变化的字段做些修改。

Helm 概述 & 安装 & 部署常见应用_哔哩哔哩_bilibili

八、容器读取pod信息:

Kubernetes Downward API 基本用法-阳明的博客|Kubernetes|Istio|Prometheus|Python|Golang|云原生
​​​​​​https://kubernetes.io/zh/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/​​​​​​

九、容器资源:

为容器和 Pod 分配内存资源 | Kubernetes

为命名空间配置默认的内存请求和限制 | Kubernetes

为容器和 Pods 分配 CPU 资源 | Kubernetes

十、调整istio-proxy中的资源:

​​​​​​如何调整istio-proxy容器resources requests取值?_应用服务网格 ASM_常见问题_流量治理_华为云​​​​​​

Istio-proxy资源占用情况

十一、grafana:

Grafana 在 Kubernetes 中的使用-阳明的博客|Kubernetes|Istio|Prometheus|Python|Golang|云原生

十二.istio和k8s的关系:

什么是 Istio?为什么 Kubernetes 需要 Istio? · Jimmy Song

十三.网关

如何理解 Istio Ingress, 它与 API Gateway 有什么区别? · Jimmy Song

十四.istio在创建pod前要做的一系列操作:

https://blog.fleeto.us/post/istio-sidecar-resource/

十五.istio的资源:

Sidecar:为拦截转发过程加入了一定的控制能力

Sidecar - Istio学习笔记

十六.k8s中的pv和pvc如何进行的关联:

通过2种资源,storageClassName设置一样来决定。

十七.istio数据面日志调试

istio 数据面日志调试 · Service Mesh|服务网格中文社区

十八.istio示例

Secure Ingress – Istio By Example

十九.控制 Egress 流量(sidecar)

控制 Egress 流量 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang|云原生

二十.Istio流量管理实现机制深度解析⭐⭐⭐⭐⭐

https://www.zhaohuabing.com/post/2018-09-25-istio-traffic-management-impl-intro/

consumer调用provider时的consumer端的流程:(可配合上面egress流量链接来看)

先进行iptables确定出向流量打到envoy的15001端口上,然后再进行下面配置的步骤去实现调用:

k8s-and-istio的学习_第10张图片

k8s-and-istio的学习_第11张图片

k8s-and-istio的学习_第12张图片

k8s-and-istio的学习_第13张图片

二十一.如何debug envoy和istio

Istio自身服务的安全风险 - Ruilin

二十二.service mesh 中的iptables流量劫持

Service Mesh中的iptables流量劫持 - Ruilin

二十三.Istio Sidecar自动注入原理

Istio Sidecar自动注入原理-赵化冰的博客 | Zhaohuabing Blog

二十四.envoy的config_dump中的内容(envoy启动的时候静态配置+启动后的动态配置):

k8s-and-istio的学习_第14张图片

二十五.出向和入向信息:

consumerd cluster接口:outbound|80||provider的svc.provider的ns.svc.cluster.local::provider的IP:provider的进程启动端口::rq_success::请求成功数
provider的cluster接口:inbound|进程启动端口||::provider的podIP:进程启动端口::rq_success::请求成功数

二十六.性能优化:

eBPF(Extended Berkeley Packet Filter)技术:流量转发过程如下链接

Service Mesh中的iptables流量劫持 - Ruilin

译文:服务网格将使用 eBPF ?是的,但 Envoy 代理将继续存在-赵化冰的博客 | Zhaohuabing Blog

二十七.istio运维:

Istio的运维-诊断工具 - charlieroro - 博客园

二十八.sidecar资源类型:

下面配置的意思是:给sidecar资源类型所在空间的所有pod生效,并且只可访问命名空间下的cluster

即,sidecar资源类型可以控制配置的下发范围;

apiVersion: networking.istio.io/v1alpha3

kind: Sidecar

metadata:

  name: sidecarcrd

  namespace: 命名空间

spec:

  egress:

  - hosts:

    "命名空间/*"

通过观察envoy的configdump即可看到;默认是所有的(所有的命名空间的)Service都会下发到每个envoy中,现在利用了sidecar只下发指定host(上面配置是指定命名空间实例)的配置;

二十三、yaml中command和args的使用、terminationMessagePath的使用、SecurityContext的使用:

确定 Pod 失败的原因 | Kubernetes

为容器设置启动时要执行的命令和参数 | Kubernetes

SecurityContext - Kubernetes指南

Configure a Security Context for a Pod or Container | Kubernetes

二十四、volumeMounts的使用:

配置 Pod 以使用卷进行存储 | Kubernetes

二十五、subpath的使用

kubernetes之subpath的使用 - yuhaohao - 博客园

二十六、k8s的Annotation与Labels

确定k8s的Annotation与Labels你用对了? - 云+社区 - 腾讯云

二十七、 Service Account 

为 Pod 配置服务账户 | Kubernetes

二十八、鉴权

鉴权概述 | Kubernetes

你可能感兴趣的:(虚拟化技术,微服务,K8S)