内网环境中安装helm,手动加载charts,当做一个目录布局合理,部署文件清晰的仓库使用。

Overview

  • helm是一个k8s的包管理工具,据我感觉,是因为一个复杂的应用,定义的资源会有数十条,类型也会有service、role、deployment、statefulset等等很多种,所以需要一个合理的组织形式,也就是charts,helm的仓库则负责分发charts。
  • 通过使用别人编写好的charts,能够很快的部署大型应用,比如istio、kafka。但问题是,helm repo只有部署文件,并不打包镜像,而部署时经常会pull不到镜像,或者即使reachable,速度也不够快。

Installation

  • 下载binary helm,放到path里。
  • helm init --client-only --skip-refresh,将会只创建目录在客户端,不生成tiller,也不拉取默认repo。
  • helm repo add name repourl,可以添加一个repo,如果有现成的使用的话。
  • 在github/charts,下载helm的stable和incutator charts,并不大,不压缩也只有5MB。
  • 如果总是template一个charts,然后直接使用部署文件,不装tiller也可以。
  • tiller的安装,找一个版本和client对应的镜像。
  • helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.5.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

Istio

Istio-deploy

  • 使用github/istio的charts,比helm自带的要好一些。
  • git clone之后一定要切换到release版本。
  • 使用helm template install/kubernetes/helm/ > istio.yaml,获得一个很长的部署文件,确保其中所有的镜像都能够下载到。
  • 原因是某些镜像没有预留修改部分在values.yaml
  • 鉴于istio不怎么需要更新,不用charts组织问题也不是很大,修改网络结构全靠新增一些配置。

Istio-gateway

  • istio声明了很多自定类型资源,我们通过Gateway来配置入口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: service-gateway
namespace: istio-system
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 81
name: http
protocol: HTTP
hosts:
- "xxx.xxx.cn"
- "yyy.cn"
  • port则是和ingressgateway配置有关,用nodeport暴露ingress的一些端口,然后在Gateway中bind使用。
  • 由于没有备案域名,所以使用了非80端口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: prom-vts
namespace: istio-system
spec:
hosts:
- "xxx.cn"
gateways:
- service-gateway
http:
- match:
- uri:
prefix: /
route:
- destination:
host: prom-prometheus-server.prom.svc.cluster.local
port:
number: 80
  • VirtualService用来关联gateway和service。

StatefulSet

statefulset需要使用到pvc和pv两个资源,也就是说,存储的support额外定义,statefulset只管使用。比较简单的可用的一种provider是nfs。更可靠和广泛使用的是ceph。

NFS Provider

  • 通过helm安装nfs-client-provider,修改镜像和填写nfs server。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
nfs:
server: 34d7b49ed9-sva88.cn-shanghai.nas.aliyuncs.com
path: /nfs/kubernetes
mountOptions:

storageClass:
create: true

# Set a provisioner name. If unset, a name will be generated.
# provisionerName:

# Set StorageClass as the default StorageClass
# Ignored if storageClass.create is false
defaultClass: true
  • 如果将storageClass设为defaultClass,则其他pod在使用时,可以不定义storageClassName。

Clear PVC

  • 通过自动创建PV去匹配PVC的时候,PV的delete policy为delete,也就是PVC被删除,PV就被删除。
  • helm delete chart 或者 kubectl delete -f install.yaml,都不会删除pvc。
  • 清理错误或者不需要的pvc,要手动清理。kubectl delete pvc name

Kafka

Kafka External Listenr

  • 不论用什么方式,访问到kafka,nat也好、域名转换也好,kafka会broadcast所有node的地址,而这个地址取决于配置中的internal-listener external-listener
  • helm kafka chart的values.yaml有预留配置,通过开启external广播和nodeport方式暴露外部访问,就可以从集群外部访问kafka了。

Kafka-Stroage

  • 如果在chart中开启persistence,并指定storageClass,则可以自动生成pvc和pv,并挂载好外部存储。但感觉这种方式,导致多个kafka节点,都将自己的存储挂载到了同一个provider,对性能并不友好。
  • 因为也没有太多的存储可用,暂时没有改这里。
  • 或许不用class,生成几个local pv,然后配置节点亲和性就好了。

Zookeeper

  • 和kafka在同一个namespace的话,就直接用service name访问了。
  • storage方案和kafka类似。

Tips

  • 重启pod。kubectl scale deployment chat --replicas=0 -n service
  • service的完整域名为,<service_name>.<namespace>.svc.<domain>,默认domaincluster.local,headless的service,可以直接通过域名解析到pod ip,而不用先跳到service vip。
  • 同一个namespace下,则可以直接用servicename去访问。