ServiceMesh-Istio:3.部署面向生产的Istio

环境

IPhostnameCPUMemory
192.168.181.101Master-00122G
192.168.181.101Node-00122G
192.168.181.101Node-00222G

要成为服务网格的条件

  • 需要给端口正确命名:如果要使用Istio 的服务每个Pod的端口都要有名字,端口名称只允许< 协议>[-<后缀>-]模式。其中< 协议>部分包括 grpchttp,http2,https,mongo, reids, tcp,tls以及udp,Istio可以对这些协议进行路由。例如name: http2-fooname: 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会用appversion标签来给遥测指标数据加上上下文信息。
  • Application UID :用户ID要求,不要使用ID(UID)值为1337的用户来运行应用。

安装Istio

官方推荐使用helm 进行安装。两种方式:通过helm template 生产配置文件并kubectl apply安装它。还可以使用helm installTiler来完全管理安装。

使用 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之后有两种类型控制器的 MutatingAdmissionWebhookValidatingAdmissionWebhookValidatingAdmissionWebhook可以根据自定的准入策略,来决定是不是拒绝请求,主要用来拒绝请求。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 的核心组件。 我们建议在生成环境部署中使用默认配置文件:

配置文件分为:defaultdemominimalsds 每个配置文件对应组件不同具体可以查阅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部署的集群不会报错)

image-20200207172435836

从 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
image-20200207175156587

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,没有网络组件去连。

image-20200207183241770

必须在主节点安装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解析

image-20200207191458116

解决:让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是让它出问题的时候继续往下走。

image-20200207185550533

删除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的证书没有被验证。

image-20200207192416992

解决方案:让metrics-server认识这个证书或者忽略这个证书。

  1. 查看 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>
    
  2. 来到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
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐