这是kubernetes集群部署的第二部分, 在上篇中我们部署了一个的kubernetes集群(4个node节点), 接下来我们将部署一些很实用的kubernetes扩展插件, 包括集群网络, 可视化, 服务发现, 集群监控。
插件镜像准备
kubernetes提供诸多使用的集群插件: 插件列表, 下面我们选取如下4个进行安装:
- Calico: 安全的L3网络和网络策略插件,通过CNI为整体集群的网络打通。
- CoreDNS: 为集群提供DNS服务, 用于服务发现(CoreDNS, 就是为了替换kube-dns的)
- Dashboard: 为用户提供Web UI。
- Heapster: 集群的监控插件, 同时也为 HPA提供指标。
以下是按照以上插件需要的镜像:
# calico依赖镜像
quay.io/calico/node:v2.6.7
quay.io/calico/cni:v1.11.2
quay.io/calico/kube-controllers:v1.0.3
# coredns依赖镜像
coredns/coredns:1.0.4
# dashboard依赖镜像
k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.2
# heapster依赖镜像
k8s.gcr.io/heapster-amd64:v1.5.0
k8s.gcr.io/heapster-grafana-amd64:v4.4.3
k8s.gcr.io/heapster-influxdb-amd64:v1.3.3
这些镜像最后会把push到我们自己的私有仓库, 如果你还没安装私有仓库请移步: 企业级Docker镜像仓库harbor的部署和使用
如果自己能翻墙,自己下载推送到自己的私有仓库, 如果出不去, 请看这里: 百度网盘kubernetes-adds插件image
加载下载的镜像到本地
docker load < calico-node.tar
docker load < calico-cni.tar
docker load < calico-kube-controller.tar
docker load < coredns.tar
docker load < dashboard.tar
docker load < heapster.tar
docker load < heapster-grafana.tar
docker load < heapster-influxdb.tar
推送到私有仓库
我私有仓库使用的是harbor, 并且已经创建了1个kubernetes的项目, 下面的操作请更换成你自己的仓库地址和项目
# coredns
docker tag coredns/coredns:1.0.4 192.168.204.15/kubernetes/coredns:1.0.4
docker push 192.168.204.15/kubernetes/coredns:1.0.4
# calico
...
网络插件-Calico
Calico是一款纯Layer 3
的数据中心网络方案(不需要Overlay网络), Calico好处是他已与各种云原生平台有良好的整合, 而Calico在每一个节点利用Linux Kernel实现高效的vRouter来负责数据的转发,而当数据中心复杂度增加时,可以用BGP route reflector来达成, 是性能最好的网络解决方案之一。
Calico还有一大优势:network policy。用户可以动态定义ACL规则,控制进出容器的数据包,实现业务需求, 比如租户隔离。
最新版本的calico已经到3.0.1, 3.0有不兼容变更, 进过几天的折腾, 问题很多, github上Issue关于3.0和k8s的问题还未得到解决, 所以我们安装2.x版本的calico。
部署注意事项
在使用Calico前当然最好撸一下官方文档,地址在这里Calico 官方文档,其中部署前需要注意以下几点:
- 官方文档中要求kubelet配置必须增加 –network-plugin=cni 选项
- calico采用daemonSet部署时, kubelet配置必须增加 –allow_privileged=true 选项
- kube-proxy组件必须采用iptables proxy mode 模式(1.2 以后是默认模式)
- kubec-proxy组件不能采用 –masquerade-all 启动,因为会与 Calico policy 冲突
- NetworkPolicy API 只要需要 Kubernetes 1.3 以上
- 启用RBAC后需要设置对应的 RoleBinding,参考官方文档 RBAC 部分
master安装calicoctl
首先需要在master节点安装calico的客户端: calicoctl 用于稍后检查calico的网络节点状态, 到calico的Github Release下载2.6版本calico对于的CLI: calicoctl 1.6.3
wget https://github.com/projectcalico/calicoctl/releases/download/v1.6.3/calicoctl
chmod +x calicoctl
mv calicoctl /usr/local/bin/
mkdir /etc/calico
然后配置客户端: /etc/calico/calicoctl.cfg:
apiVersion: v1
kind: calicoApiConfig
metadata:
spec:
datastoreType: "etcdv2"
etcdEndpoints: "https://192.168.204.3:2379"
etcdKeyFile: "/etc/kubernetes/pki/kubernetes-key.pem"
etcdCertFile: "/etc/kubernetes/pki/kubernetes.pem"
etcdCACertFile: "/etc/kubernetes/pki/ca.pem"
然后等集群启动后测试。
DaemonSet安装calico插件
这里采用calico standard hosted install, 使用2.6的安装说明
下载最新2.6.x版本
mkdir calico && cd calico
wget https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/hosted/calico.yaml
wget https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/rbac.yaml
修改相关文件
rbac文件没有需要调整的, 而calico需要配置ETCD的相关参数, 因此修改calico.yaml如下2个部分:
(a). 指定etcd的地址(ConfigMap中):
etcd_endpoints: "https://192.168.204.3:2379"
(b). 指定etcd的证书(ConfigMap中)
# If you're using TLS enabled etcd uncomment the following.
# You must also populate the Secret below with these files.
etcd_ca: "/calico-secrets/etcd-ca"
etcd_cert: "/calico-secrets/etcd-cert"
etcd_key: "/calico-secrets/etcd-key"
(c). 添加base64编码的证书内容(Secret中):
# Populate the following files with etcd TLS configuration if desired, but leave blank if
# not using TLS for etcd.
# This self-hosted install expects three files with the following names. The values
# should be base64 encoded strings of the entire contents of each file.
etcd-key: $(cat /etc/kubernetes/pki/kubernetes-key.pem | base64 | tr -d '\n')
etcd-cert: $(cat /etc/kubernetes/pki/kubernetes.pem | base64 | tr -d '\n')
etcd-ca: $(cat /etc/kubernetes/pki/ca.pem | base64 | tr -d '\n')
(d) 修改3个image为自己私有仓库的地址:
quay.io/calico/node:v2.6.7 --> 192.168.204.15/kubernetes/calico/node:v2.6.7
quay.io/calico/cni:v1.11.2 --> 192.168.204.15/kubernetes/calico/cni:v1.11.2
quay.io/calico/kube-controllers:v1.0.3 --> 192.168.204.15/kubernetes/calico/kube-controllers:v1.0.3
确认kubelet配置
确认kubelet是否开启daemonSet允许权限
查看所有node节点的kubelet配置文件是否添加了该选项: --allow_privileged=true
如果没添加, 添加然后重启kubelet
执行安装
kubectl apply -f rbac.yaml
kubectl create -f calico.yaml
[root@k8s-apiserver01 calico]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-76ddc77958-pc7t2 1/1 Running 1 1d
calico-node-4jr45 2/2 Running 2 1d
calico-node-5cvkj 2/2 Running 0 1h
calico-node-sllgc 2/2 Running 0 1d
calico-node-xwf7g 2/2 Running 2 1d