Kubernetes

初步了解

啥也不说了,看这个视频,迄今为止看到的对Kubernetes最简单清晰的解释。

Kubenetes的componentsconcepts需要看一下,了解Kubernetes的基本概念和整体架构。

Pods and Controllers. Pod是Kubernetes内最基础的工作单元,拥有唯一的IP/Port或者volumes。通常一个Pod运行一个app container,有的需要运行多个container,或者先运行init container运行启动app container前的先行辅助工作。如果是需要Pod协作比如rollout,那就需要controller。常见的controller为StatefulSet, DaemonSet, Deployment, ReplicaSet等。

Kubenetes的container runtimes,不只是Docker,还有CRI-O(lightweight container runtime for Kubernetes),containerd等。这里谈到了CRI-O/Kubernetes的架构,涉及到了几个概念CNCF(Cloud Native Computing Foundation), CRI(Container Runtime Interface), CNI(Container Network Interface), OCI(Open Container Initiative)。runc为OCI-compliant runtime,除了runc还有Kata Containers。Minikube uses CRI-O as the container runtime。

搭建

如果想快速体验kubernetes,可以用minikube,看这里。如果是生产环境,参考官方文档Building High-Availability Clustersbuild large clusters

Kubernetes v1.18 supports clusters with up to 5000 nodes, 150000 pods, 300000 containers, 100 pods per node。

Etcd

说到Kubernetes不得不说etcd,一个由CoreOS团队发起的分布式K/V数据库,kubernetes的configuration data, state data, and metadata都是由etcd来存储,etcd一般放在master,或者单独的节点。移步这里了解更多etcd,包括etcd vs redis, etcd vs zookeeper等

Route

DNS server + kube-proxy: Pod1 + Pod2 … –> service, a service has virtual IP (cluster IP of the service), port and internal domain name (my-svc.my-namespace.svc.cluster-domain.example, dns looking up my-svc.my-namespace works).
ServiceTypes: service — http/https routes, ClusterIP (internal IP, by default), NodePort (requesting NodeIP:NodePort from outside cluster), LoadBalancer (using a cloud provider’s load balancer), ExternalName (CNAME)
Ingress: service — http/https routes, ingress exposes http/https routes from outside the cluster to services within the cluster.

另一篇文章Kubernetes Network进一步介绍了Kubernetes的网络模型。

Storage

PV/PVC是Kubernetes storage的核心概念。PV是volume资源,由admin来provision,PVC是利用PV的声明,表示需要多少volume。

PV可以手动分配,也可以通过StorageClass自动分配。Kubernetes内置了很多StorageClass,也可以用第三方的StorageClass

Configuration

Kubernetes推荐用YAML写配置,尽量考虑写在一个文件,参考guestbook-all-in-one.yaml。用Deployment ReplicaSets Service,不要用naked nodes。ConfigMapSecret是两个协助配置的API Object。

ConfigMap

ConfigMap可以配置成环境变量,CLI的参数变量,以及Volume中的配置文件。

container的/config/路径下会有4个文件:

Secret

Kubernetes Secret用来保存管理敏感信息如密码,token,ssh key等。Pod是怎么使用secrets的呢,两种途径:一是以文件形式存在于Volume,使用时被mount到container的某个路径,另一种是kubelet pull image时使用。官方有比较好的使用例子

注意的是,如果用yaml文件创建secret,可以指定data或者stringData两种map方式。如果是用data类型,那么字符串需要用base64加密。加密解密可以用如下命令行:

$echo -n ‘admin’ | base64
$echo ‘YWRtaW4=’ | base64 –decode

Resources

计算资源的请求和限定,可以这样定义

  • spec.containers[].resources.limits.cpu
  • spec.containers[].resources.limits.memory
  • spec.containers[].resources.limits.hugepages-<size>
  • spec.containers[].resources.requests.cpu
  • spec.containers[].resources.requests.memory
  • spec.containers[].resources.requests.hugepages-<size>

kubernetes也定义了CPU和Memory的单位。One cpu, in Kubernetes, is equivalent to 1 vCPU/Core for cloud providers and 1 hyperthread on bare-metal Intel processors。vCPU即Virtual CPU,是CPU资源的分割单元,不同的云厂商会有不同的分割规则,一般是小于1Core。hyperthread即为超线程,Intel提出的技术,相当于虚拟出来的cpu资源,比如物理CPU有4Core,使用HT技术可以虚拟出8Core。cpu: 0.1 和 cpu: 100m是等同的。接下来的例子是,为这个pod申请0.25cpu,64Mib内存,最大限制是0.5cpu,128Mib内存。

LimitRange

管理员可以为某个namespace中的Pod/container资源占用进行限制,或者设置默认的资源分配(适用于Pod的定义没有指定资源)。这里有很多例子。

ResourceQuota

ResourceQuota是给namespace限定的资源上限,超出上限会报403错误。这里的资源可以是cpu, memory,也可以是storage,甚至Object的个数,比如service, ConfigMap等。如果指定了requests.cpu/requests.memory,那么需要这个namespace的Pod等Object有明确的request定义,limits.cpu/limits.memory相同的要求。了解更多ResourceQuota,看这里

Security

Controlling access to the Kubernetes API

Overview of cloud native security

Pod security policy

Admission controllers

ServiceAccount

Logging

Metrics

Service Catalog

Kubernetes支持安装Service Catalog.

Kubernetes API

Kubernetes API Doc
Kubernetes API Conventions

Example

WordPress + MySQL
PHP Guestbook + Redis

需要注意的是,在WordPress例子中用到了StatefulSet API Object。StatefulSet用来管理stateful应用。Pod的dns不会变,即使重新创建,而且DNS内含一个序号。Pod如果绑定PVC,那么PVC将和这个Pod DNS永久绑定。

参考

架构总览
网络总览
4种网络通信
IBM对Kubernetes的介绍

开发辅助工具

cdk8s.io?

进一步了解kubernetes,参考官方文档,或者IBM的系列文章

标签:

发表评论