Jerry的Kubernetes学习笔记

  • 是时候使用Helm了:Helm, Kubernetes的包管理工具

  • 简化Kubernetes应用部署工具-Helm安装

  • Picking the Right Solution

  • 吐槽安装的

  • Kubernetes on Ubuntu

  • Get Docker EE for Ubuntu

useful shell script

  • which kubectl
  • kubectl version
  • 查看ubuntu版本:cat /etc/issue
  • set proxy:
    export http_proxy=http://duotai:[email protected]:24448
    export https_proxy=$http_proxy

Docker设置proxy的文件: /etc/default/docker

  • docker pull hello-world
  • docker run hellow-world
  • kubectl cluster-info

To further debug and diagnose cluster problems, use ‘kubectl cluster-info dump’.
Unable to connect to the server: context deadline exceeded (Client.Timeout exceeded while awaiting headers)

  • systemctl restart kube-apiserver
  • kubectl get nodes
  • kubectl get svc
  • kubectl describe node
  • kubectl get endpoints
  • kubectl get svc tomcat-service -o yaml
  • kubectl get namespaces --namespace=development
  • systemctl daemon-reload
  • systemctl enable etcd.service - 将服务加入开机启动列表
  • systemctl start etcd.service
  • kubectl run nginx --image=nginx:1.12.2
  • etcdctl cluster-health - 验证etcd是否正确启动
  • kubectl describe pods
  • kubectl get pods -l environment=production,tier=frontend
  • kubectl get pods -l ‘environment in (production),tier in (frontend)’
  • export TILLER_NAMESPACE=$(kubectl config view -o json | jq -r “.contexts[0].context.namespace”)
  • get -o wide json -o=yaml
  • docker ps -a
  • nginx image html position: /usr/share/nginx/html

etcd, kube-controller-manager, kube-scheduler这些

Terminology

  • CRI Container Runtime Interface

第一章

  1. 为什么被8080refused了呢。别着急,还没有启动呢,这是没有成功连接kubernetes apiserver的节奏,一切正常,到目前为止,我们只是下载了一个可执行文件设置了权限而已。

  2. 用replicationcontroller创建pod,再创建service,暴露cluster IP. tcp访问。

kubelet是进程,向Master注册自己

  1. 一个pod内的容器与另外主机上的pod容器能够直接通信。

pod的ip加上containerport,组成了endpoint,代表pod里的一个服务进程的对外通信地址。

m:千分之一个CPU配额。

Master node上的Controller Manager定期巡检系统中存活的目标pod,确保其实例数量等于RC的期望值。

  1. Deployment -> Replication Set->Pod copy creation

检查Deployment状态来看部署动作是否完成

HPA:Horizontal Pod Autoscaling - 横向自动扩容

通过跟踪分析RC控制的所有目标POD的负载变化来确定是否需要针对性的调整目标POD的副本数。

监控CPU使用率,当前使用量 / yaml里的pod request。

HPA本身也是一种kind:HorizontalPodAutoscaler

service就是我们说的微服务。Pod和RC其实都是为Service做铺垫。

Service和后端pod副本集群间通过Label Selector实现无缝对接。

rc的作用:保证service的服务能力和质量始终处于预期的标准,服务之间通过TCP/IP通信。每个pod都有单独的IP,和containerPort一起组成了end point,那组成集群后的入口是什么?负载均衡器(软件或硬件),负责决定请求被转发到哪个pod。每个node上都运行了kube-proxy进程,实际就是一个智能的软件负载均衡器,负责把对service的请求转发到后端某个pod上,并在内部实现服务的负载均衡与会话保持机制。

每个service有一个全局唯一的虚拟IP地址,cluster IP,每个服务具有唯一IP地址的通信节点。整个生命周期内不变。内部pod的endpoint会随销毁和重新创建而发生变化。

  1. targetPort: 确定提供宫该服务的容器所暴露的端口号,即具体业务进程在容器内的targetPort上提供TCP/IP接入,而port属性则定义了service的虚端口。

服务发现 - 如何通过Service name找到cluster ip?

Cluster IP是Service创建后由Kubernetes自动分配的,其他pod无法预先知道某个service的cluster IP地址。因此需要一个服务发现机制来找到这个服务。

a. Service生成一些Linux环境变量,pod启动时注入环境变量。通过Add-On
增值包引入DNS系统,把服务名作为dns域名。通过服务名建立通信连接。

  1. Node ip:

node节点的IP地址。真实存在的物理网络,Kubernetes集群外的节点访问集群内的节点时,必须通过node ip进行通信。

很多服务都存在多个端口,一个端口提供业务服务,另一个端口提供管理服务。

Pod IP是每个pod的ip地址,是Docker engine根据docker0网桥的IP地址段进行分配的。通常是一个虚拟的二层网络。

一个pod里的容器访问另一个pod里的容器,就是通过pod IP所在的虚拟二层网络进行通信的,而真实的tcp/IP流量通过node IP所在的物理网卡流出。

Cluster IP没有一个实体网络对象,因此无法被ping。不具备TCP/IP通信基础,属于Kubernetes集群的封闭空间。

集群内部,node ip,pod IP,cluster IP之间的通信,采用的是一种特殊的路由规则,和IP路由完全不同。

使用nodeport同外界通信。

http://:

nodeport就是一个TCP监听端口。

GCE - google cloud engine

volume在pod中的意思是能被多个Docker访问的共享目录。

Kubernetes中的volume与pod的生命周期相同,但与容器的生命周期无关。

给volume定义一个名字,然后mount到docker的某个目录下。

volume类型:

emptyDir: pod分配到node时创建,初始内容为空,无须指定宿主机上对应的目录文件,由Kubernetes自动分配一个目录,当pod从node上移除时,emptyDir中的数据也被永久删除。

用于临时空间,一个容器需要从另一个容器中获取数据的目录。

hostPath:在pod上挂载宿主机上的文件或目录。

  • 容器应用程序生成的日志文件需要永久保存。
  • 需要访问宿主机上Docker引擎内部数据结构的容器应用,定义hostPath
    为/var/lib/docker, 是容器内部应用可直接访问Docker上的文件系统。

PV只能是网络存储,不属于任何Node,但可以在每个node上访问。PV不是定义在node上的,而是独立于pod之外定义。

  1. namespace:多租户隔离

不同的分组在共享使用整个集群资源同时还能被分别管理. 默认是default。

  1. annotation

annotation和label类似,都是key/value, 但label有严格的naming convention,定义的是Kubernetes对象的元数据,而且用于label selector,而annotation是用户任意定义的附加信息,用于外部工具查找。

第二章

  1. 可在Google的GCE上安装。

DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53

如果在DNS服务器处显示的是个人公司的内部网络地址,那么说明该公司的DNS解析工作是交给公司内部的DNS服务器来完成的,这时需要检查这个DNS服务器,在DNS服务器上进行nslookup操作看是否可以正常解析

工作node上仅需部署kubelet和kube-proxy服务进程。

Master与工作node间会有大量网络通信,在防火墙上需配置各组件需要相互通信的端口号。

etcd是Kubernetes集群的主数据库

Kubernetes各组件与Master之间通过apiserver的非安全端口http://apiserver:8080访问,但如果apiserver需要对外提供服务,或者集群中某些容器需要访问apiserver以获取集群中的某些信息,CA签名的双向数字证书认证。

google_containers/pause的镜像实现pod的概念

http://gcr.io

第二章有很多命令行参数。

进度

2018-11-12 11:02AM 看到P38 1.4.6 Deployment,飞机上14:16看到42页。
20:30, p46, 三种ip. 10:15 53 namespace 22:31第一章结束。

Docker

Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上(译者注:镜像栈顶部)添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。

为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。

learn from internet

确保pod数量:它会确保Kubernetes中有指定数量的Pod在运行。如果少于指定数量的pod,Replication Controller会创建新的,反之则会删除掉多余的以保证Pod数量不变。

确保pod健康:当pod不健康,运行出错或者无法提供服务时,Replication Controller也会杀死不健康的pod,重新创建新的。

弹性伸缩 :在业务高峰或者低峰期的时候,可以通过Replication Controller动态的调整pod的数量来提高资源的利用率。同时,配置相应的监控功能(Hroizontal Pod Autoscaler),会定时自动从监控平台获取Replication Controller关联pod的整体资源使用情况,做到自动伸缩。

滚动升级:滚动升级为一种平滑的升级方式,通过逐步替换的策略,保证整体系统的稳定,在初始化升级的时候就可以及时发现和解决问题,避免问题不断扩大。

see:https://www.jianshu.com/p/6bc8e0ae65d1

Docker Swarm vs Kubernetes

minikube相关

  • Kubectl: Kubernetes with minikube times out

你可能感兴趣的:(SAP,Kubernetes)