ServiceMesh-Istio:3.部署面向生产的Istio
ServiceMesh-Istio:3.部署面向生产的Istio文章目录ServiceMesh-Istio:3.部署面向生产的Istio环境要成为服务网格的条件安装Istio1. 下载 Istio 发型包2. 先决条件3 .Istio Init4. 安装Istio5. 卸载Istio6. 修复metrics-server问题(二进制安装k8s的集群才会有,kubeadm部署的集群直接下载安装...
ServiceMesh-Istio:3.部署面向生产的Istio
文章目录
环境
IP | hostname | CPU | Memory |
---|---|---|---|
192.168.181.101 | Master-001 | 2 | 2G |
192.168.181.101 | Node-001 | 2 | 2G |
192.168.181.101 | Node-002 | 2 | 2G |
要成为服务网格的条件
- 需要给端口正确命名:如果要使用Istio 的服务每个Pod的端口都要有名字,端口名称只允许< 协议>[-<后缀>-]模式。其中< 协议>部分包括
grpc
、http
,http2
,https
,mongo
,reids
,tcp
,tls
以及udp
,Istio可以对这些协议进行路由。例如name: http2-foo
和name: http
都是有效的端口名,但是name: http2foo
就不行。如果没给端口命名或者没有指定使用的前缀,那么这一端口视为普通TCP流量(除非显示的用Protool: UDP
声明该端口是UDP端口)。 - Pod 端口声明:Pod必须包含每个容器将监听的明确端口列表。在每个端口的容器规则中
containerPort
。任何微列出端口的都将绕过Istio Proxy。 - **关联服务:**Pod 不论是否公开端口,都必须关联至少一个Service上,如果一个Pod属于多个服务,这些服务不能在同一端口上使用不同协议,例如 HTTP和TCP。
- Deployment应该有
app
以及version
这两个标签。建议在使用kubernetes Deployment 进行Pod 部署的时候,建议显式为Deployment加上app
以及version
标签。每个Deployment应该有一个有意义的app标签。app
标签在分布式追踪的过程中会被用来加上上下文信息。Istio会用app
和version
标签来给遥测指标数据加上上下文信息。 - Application UID :用户ID要求,不要使用ID(UID)值为1337的用户来运行应用。
安装Istio
官方推荐使用helm 进行安装。两种方式:通过helm template
生产配置文件并kubectl apply
安装它。还可以使用helm install
让Tiler来完全管理安装。
使用 Helm 安装 Istio 的方式正在被弃用,不过 更高版本的可以使用 istioctl 安装 Istio 。
这个我们使用helm template模式安装
1. 下载 Istio 发型包
我们这个以istio1.1.7为例,更高的版本有更高级的安装方式。
Istio会被安装到自己的
istio-system
命令空间,并且能够对所有其他命名空间的服务进行管理。
1.1 进入Istio release 页面,下载对应目标操作系统的安装文件。
➜ ~ wget https://github.com/istio/istio/releases/download/1.1.7/istio-1.1.7-linux.tar.gz
1.2 解压
➜ ~ tar zxvf istio-1.1.7-linux.tar.gz
2. 先决条件
安装前我们要明白一个问题:流量如何进入到Envoy?
第一种 通过
iptables
劫持,但是我们需要认识一个原理。**Sidercars自动注入的原理:**利用
准入
控制器(Admission Controller)。一个API请求ApiServer 分为三步:认证、授权、准入,准入就是这三部中的最后一步。本质上是一段代码。在k8s1.9之后有两种类型控制器的MutatingAdmissionWebhook
和ValidatingAdmissionWebhook
。ValidatingAdmissionWebhook
可以根据自定的准入策略,来决定是不是拒绝请求,主要用来拒绝请求。MutatingAdmissionWebhook
根据预先定好的配置来对请求进行编辑,通过它就可以对每个pod建立一个initcontainers 用于设置iptables
,把流量劫持,让他出口和入口都通过Envoy。第二种 通过直接部署 istio的CNI插件,CNI是一个插件链,istio的CNI插件不会影响现有的calico,它是又加一层CNI插件专门做网络初始化设置的。默认他是关闭的需要手动打开安装CNI插件。
CNI插件出来的时间比较短,我们选择默认的通过准入控制进行设置。
3 .Istio Init
3.1 为istio组件创建一个命名空间istio-system
:
➜ ~ kubectl create namespace istio-system
3.2 创建istio文件夹 拷贝1.2步骤解压的文件
# 创建一个istio文件夹
➜ ~ mkdir istio
# 进入文件
➜ ~ cd istio
# 拷贝刚才解压的 istio-1.1.7/install/kubernetes/helm/文件到当前目录
➜ ~ cp -r /root/ istio-1.1.7/install/kubernetes/helm/ .
3.3 修改镜像地址
➜ ~ cd helm/istio-init/
# 修改镜像下载地址
➜ ~ vim values.yaml
#修改成我们自己镜像仓库,但是先要下载好当前版本istio所使用的所有镜像文件
hub: registry.cn-hangzhou.aliyuncs.com/imooc-istio
3.4 在Charts中导出所有istio 在k8s 中的配置
➜ ~ helm template . --name imooc-istio-init --namespace istio-system > istio-init.yaml
3.5 创建一下
➜ ~ kubectl apply -f istio-init.yaml
3.5 查看一下pod Completed
属于完成状态。
➜ ~ kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
istio-init-crd-10-45fnd 0/1 Completed 0 10s
istio-init-crd-11-ht76r 0/1 Completed 0 10s
# 查看一下跟istio有关的crd个数,有点多总共53个crd
➜ ~ kubectl get crd|grep istio|wc -l
4. 安装Istio
选择一个 配置文件 接着部署与您选择的配置文件相对应的 istio
的核心组件。 我们建议在生成环境部署中使用默认配置文件:
配置文件分为:
default
、demo
、minimal
、sds
每个配置文件对应组件不同具体可以查阅https://preliminary.istio.io/zh/docs/setup/additional-setup/config-profiles/
4.1 查看配置文件
# 对应的配置文件的目录就是跟istio-init同级的istio
➜ ~ cd.. && cd istio && tree
省略....
├── values-istio-demo-auth.yaml
├── values-istio-demo.yaml
├── values-istio-minimal.yaml
├── values-istio-remote.yaml
├── values-istio-sds-auth.yaml
└── values.yaml #default配置文件
4.2 修改default配置文件的仓库地址
配置文件中定义每个组件的开启方式
➜ ~ vim values.yaml
#修改成我们自己镜像仓库,但是先要下载好当前版本istio所使用的所有镜像文件
hub: registry.cn-hangzhou.aliyuncs.com/imooc-istio
4.5 导出istio对应配置 放到istio.yaml
文件里面,具体详细信息不看了,太多了。
➜ ~ helm template . --name imooc-istio --namespace istio-system > istio.yaml
4.6 主要看下镜像地址是否是我们配置的地址
之前我们4.2步骤我们配置过仓库地址,导出
istio.yaml
也会自定替换成我们的配置的仓库地址。
# 查看一下镜像地址是否对 只有prometheus不对。
➜ ~ grep image: istio.yaml
image: "registry.cn-hangzhou.aliyuncs.com/imooc-istio/proxy_init:1.1.7"
image: [[ annotation .ObjectMeta `sidecar.istio.io/proxyImage` "registry.cn-hangzhou.aliyuncs.com/imooc-istio/proxyv2:1.1.7" ]]
image: "registry.cn-hangzhou.aliyuncs.com/imooc-istio/kubectl:1.1.7"
image: "registry.cn-hangzhou.aliyuncs.com/imooc-istio/kubectl:1.1.7"
image: "registry.cn-hangzhou.aliyuncs.com/imooc-istio/galley:1.1.7"
image: "registry.cn-hangzhou.aliyuncs.com/imooc-istio/proxyv2:1.1.7"
image: "registry.cn-hangzhou.aliyuncs.com/imooc-istio/mixer:1.1.7"
image: "registry.cn-hangzhou.aliyuncs.com/imooc-istio/proxyv2:1.1.7"
image: "registry.cn-hangzhou.aliyuncs.com/imooc-istio/mixer:1.1.7"
image: "registry.cn-hangzhou.aliyuncs.com/imooc-istio/proxyv2:1.1.7"
image: "registry.cn-hangzhou.aliyuncs.com/imooc-istio/pilot:1.1.7"
image: "registry.cn-hangzhou.aliyuncs.com/imooc-istio/proxyv2:1.1.7"
image: "docker.io/prom/prometheus:v2.3.1" # 地址不对
image: "registry.cn-hangzhou.aliyuncs.com/imooc-istio/citadel:1.1.7"
image: "registry.cn-hangzhou.aliyuncs.com/imooc-istio/sidecar_injector:1.1.7"
# 修改 prometheus 镜像地址
➜ ~ vi charts/prometheus/values.yaml
# hub地址 改成如下:
hub: registry.cn-hangzhou.aliyuncs.com/imooc-istio
改完之后需要再次生成配置
4.7再次生成配置
# 查看历史打过的命令
➜ ~ history | grep istio
# 再次生成配置
➜ ~ helm template . --name imooc-istio --namespace istio-system > istio.yaml
# 再次检查镜像地址
➜ ~ grep image: istio.yaml
4.8 创建一下istio.yaml
➜ ~ kubectl apply -f istio.yaml
主要这里如果你是二进制安装的k8s 会报错如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FfzBVwVJ-1581645658228)(/Users/zck/Library/Application Support/typora-user-images/image-20200207154119633.png)]
是因为istio-ingressgateway使用的nodePort 端口是31280 ,而你设置的nodePort端口范围比31380小就会这样。
4.9 查看跟istio有关的组件的pod
# 查看istio有关的组件的pod
➜ ~ kubectl get pods -n istio-system
#查看状态!=Completed 的pod
➜ ~ kubectl get pods -n istio-system |grep -v Completed
# 如果都没问题就是应该这个样子
NAME READY STATUS RESTARTS AGE
istio-citadel-57c859cf76-nr5ws 1/1 Running 0 4m5s
istio-galley-6bbd7596b9-vxprz 1/1 Running 0 4m5s
istio-ingressgateway-77f7595c8-tb2jc 1/1 Running 0 4m5s
istio-pilot-6fbc9c89cd-qn4kx 2/2 Running 0 4m5s
istio-policy-8455bd84b9-xqhxj 2/2 Running 5 4m5s
istio-sidecar-injector-6c7574484f-zpxg2 1/1 Running 0 4m5s
istio-telemetry-67c85bbf-sbrps 2/2 Running 4 4m5s
prometheus-59795bc557-c2zzn 1/1 Running 0 4m5s
5. 卸载Istio
# 删除istio
➜ ~ kubectl delete -f istio.yaml
# 删除istio init
➜ ~ kubectl delete -f istio-init.yaml
第6步骤可以不做,因为metrics-server是监控当前集群的机器情况。
6. 修复metrics-server问题(二进制安装k8s的集群 才会有,kubeadm部署的集群直接下载安装metrics-server)
metrics-Server找不到
5.1 查看下系统日志
➜ ~ journalctl -f
如果你们用二进制部署的k8s集群就会报错如下:metrics-Server找不到(kubeadm部署的集群不会报错)
从 v1.8 开始,资源使用情况的监控可以通过 Metrics API的形式获取,具体的组件为Metrics Server,用来替换之前的heapster,heapster从1.11开始逐渐被废弃。
Metrics-Server是集群核心监控数据的聚合器,从 Kubernetes1.8 开始,它作为一个 Deployment对象默认部署在由kube-up.sh脚本创建的集群中,如果是其他部署方式需要单独安装.
metrics-server并不是api-server 的一部分,是以一种插件的机制,独立部署,需要调整api-server启动参数。
5.2 先生成 证书和密钥:
我当前密钥存放路径 //etc/kubernetres/pki
#我们这个使用的是admin的证书
#生成metrics-server证书和密钥
➜ ~ cfssl gencert -ca=/etc/kubernetres/pki/ca.pem \
-ca-key=/etc/kubernetres/pki/ca-key.pem \
-config=../ca-config.json \
-profile=kubernetes admin-csr.json | cfssljson -bare admin
# 大致生成了这个几个
admin-key.pem admin.pem
➜ ~ cp admin*.pem /etc/kubernetres/pki/
启动参数:
--requestheader-client-ca-file=/etc/kubernetres/pki/ca.pem \ # 使用以前生成的ca
--requestheader-allowed-names= \
--requestheader-extra-headers-prefix=X-Remote-Extra-
--requestheader-group-headers=X-Remote-Group
--requestheader-username-headers=X-Remote-User
--proxy-client-cert-file=/etc/kubernetres/pki/admin.pem \ #对应生成的证书
--proxy-client-key-file=/etc/kubernetres/pki/admin-key.pem \ #对应生成的密钥
5.3 这个些启动参数主要是给metrics-server使用的证书和密钥
把上面的启动参数粘贴到 /etc/systemd/system/kube-apiserver.service
➜ ~ vim /etc/systemd/system/kube-apiserver.service
5.4 重启
➜ ~ systemctl daemon-reload
➜ ~ service kube-apiserver restart
5.5 下载metrics-server
github https://github.com/kubernetes-sigs/metrics-server
如果当前集群版本大于1.8直接部署就可以
去release下载,我们这里使用0.3.3
➜ ~ wget https://github.com/kubernetes-sigs/metrics-server/archive/v0.3.3.tar.gz
➜ ~ tar -zxvf v0.3.3.tar.gz
# 进入解压的文件
➜ ~ cd metrics-server-0.3.3/deploy/1.8+/
# 修改镜像地址
➜ ~ vim metrics-server-deployment.yaml
# 改成如下地址
image: registry.cn-hangzhou.aliyuncs.com/imooc-istio/metrics-server-amd64:v0.3.3
修改完成之后直接安装。
5.6 安装
➜ ~ kubectl apply -f .
# 查看一下
➜ ~ kubectl get pods -n kube-system
metrics-server-7bbf4fdbbd-ncx2b 1/1 Running 0 65s
主节点没有网络插件访问metrics-server
5.7再次查看系统日志(kubeadm安装方式可以忽略)
journalctl -f
(二进制安装k8s的集群才会报这个错误,kubeadm不会)如果报错如下:说明api-server 连不到https://10.95.89.171:443 这个服务,这个服务就是metrics-server。为什么没有连不到?
因为这个连接是serviceIP,二进制安装k8s的集群 主节点没有kube-proxy ,kubelet,calico,没有网络组件去连。
必须在主节点安装kube-proxy ,kubelet,calico,最后重启kubelet。如何安装自行百度。
还是错误的metrics的DNS没找到https://dhb-10-10.126-jiagou.con/10250/stats/summary/ ,如果主节点做了host DNS解析就不会这样。
# 查看一下metrics-server的pod 日志
➜ ~ kubectl logs metrics-server-7bbf4fdbbd-ncx2b -n kube-system
报错DNS解析
解决:让hostname 支持DNS解析
# 1.找到coredns
➜ ~ kubectl get cm -n kube-system
NAME DATA AGE
coredns 1 115m
#修改coredns配置,添加host
➜ ~ kubectl edit cm -n kube-system coredns
增加host配置 ,10.155.10.开头的都是对应集群的IP hostname, fallthrough
是让它出问题的时候继续往下走。
删除metrics-server的Pod 让他重新创建一个=等于重启。
➜ ~ kubectl delete pod metrics-server-7bbf4fdbbd-ncx2b -n kube-system
pod "metrics-server-7bbf4fdbbd-ncx2b" deleted
➜ ~ kubectl get pod -n kube-system |grep metri
metrics-server-7bbf4fdbbd-cpr62 1/1 Running 0 2m7s
再次查看metrics-server的Pod 的log 启动是否正常。
kubectl logs -f metrics-server-7bbf4fdbbd-cpr62 -n kube-system
又换了一个错误:metrics-server的证书没有被验证。
解决方案:让metrics-server认识这个证书或者忽略这个证书。
-
查看 metrics-server容器运行节点
kubectl get pods metrics-server-7bbf4fdbbd-cpr62 -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES metrics-server-7bbf4fdbbd-cpr62 1/1 Running 0 11m 192.168.93.91 node-001 <none> <none>
-
来到metrics-server容器运行节点,查看一下metrics-server容器参数有没有忽略证书的
docker ps |grep metrics-server
docker exec -it 489 /metrics-server --help
# 这两个--kubelet-certificate-authority是指定一个证书来校验kubelet证书,--kubelet-insecure-tls忽略证书
--kubelet-certificate-authority string Path to the CA to use to validate the Kubelet's serving certificates.
--kubelet-insecure-tls Do not verify CA of serving certificates presented by Kubelets. For testing purposes only.
3.回到主节点增加忽略证书配置args:["--kubelet-insecure-tls"]
vi metrics-server-deployment.yaml
在文件的最后containers:内增加args:["--kubelet-insecure-tls"]
containers:
- name: metrics-server
image: registry.cn-hangzhou.aliyuncs.com/imooc-istio/metrics-server-amd64:v0.3.3
imagePullPolicy: Always
args:["--kubelet-insecure-tls"] #增加这个一行
volumeMounts:
- name: tmp-dir
mountPath: /tmp
更多推荐
所有评论(0)