内网环境中安装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 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
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>
,默认domain
为cluster.local
,headless的service,可以直接通过域名解析到pod ip,而不用先跳到service vip。
- 同一个namespace下,则可以直接用servicename去访问。