1 Kubernetes集群环境
Istio支持在不同的平台下安装其控制平面,例如Kubernetes、Mesos和虚拟机等。
课程上以 Kubernetes 为基础讲解如何在集群中安装 Istio (Istio 1.0.6 要求Kubernetes的版本在1.11及以上)。
可以在本地或公有云上搭建Istio环境,也可以直接使用公有云平台上已经集成了Istio的托管服务。
目前有许多软件提供了在本地搭建Kubernetes集群的能力,例如Minikube/kubeadm都可以搭建kubernetes集群,我这边所选用的是kubeadm来安装Kubernetes集群。
Kubeadm 是一个工具,它提供了 kubeadm init 以及 kubeadm join 这两个命令作为快速创建 kubernetes 集群的最佳实践。
准备机器
两台centos7的虚拟机,地址分别为
192.168.187.137
192.168.187.138
大家根据自己的情况来准备centos7的虚拟机。 虚拟机要保证彼此之间能够ping通,也就是处于同一个网络中。 Kubernets官网推荐虚拟机的配置最低要求:2核2G(这边建议最低2核3G配置)
Docker环境
在每一台机器上都安装好Docker,我这边使用的版本为18.09.0 # docker查看版本命令 docker --version
修改hosts文件
(1)设置master角色,在192.168.187.138打开hosts文件
# 打开hosts文件 vi /etc/hosts # 设置192.168.187.138为master的hostname,用m来表示 192.168.187.138 m # 设置192.168.187.137为worker的hostname,用w1来表示 192.168.187.137 w1
(2)设置worker角色,在192.168.187.137打开hosts文件
# 打开hosts文件 vi /etc/hosts # 设置192.168.187.138为master的hostname,用m来表示 192.168.187.138 m # 设置192.168.187.137为worker的hostname,用w1来表示 192.168.187.137 w1
(3)使用ping测试一下
ping m
ping w1
kubeadm安装版本
安装的版本是1.14.0
kubernetes集群网络插件-calico
calico网络插件:https://docs.projectcalico.org/v3.9/getting-started/kubernetes/
calico,同样在master节点上操作
Calico为容器和虚拟机工作负载提供一个安全的网络连接。
验证 Kubernetes安装
1)在master节点上检查集群信息
命令:kubectl get nodes
2)监控 w1节点的状态 :kubectl get nodes -w
监控成 ready状态
3)查询pod 命令:kubectl get pods -n kube-system
注意:Kubernetes集群安装方式有很多,大家可以安装自己熟悉的方式搭建Kubernetes, 这里只是介绍本次课程上使用的kubernets集群环境
2 安装Istio
在Istio的版本发布页面https://github.com/istio/istio/releases/tag/1.0.6下载安装包并解压(我用的是一个比较稳定的版本1.0.6版本,放到master上面,以Linux平台的istio-1.0.6-linux.tar.gz为例)1.解压tar -xzf istio-1.0.6-linux.tar.gz
2.进入istio目录cd istio-1.0.6/
Istio的安装目录及其说明
文件/文件夹 说明 bin 包含客户端工具,用于和Istio APIS交互 install 包含了Consul和Kubernetes平台的Istio安装脚本和文件,在Kubernetes平台上分为YAML资源文件和Helm安装文件
istio.VERSION | 配置文件包含版本信息的环境变量 |
samples | 包含了官方文档中用到的各种应用实例如bookinfo/helloworld等等,这些示例可以帮助读者理解Istio的功能以及如何与Istio的各个组件进行交互 |
tools | 包含用于性能测试和在本地机器上进行测试的脚本文件和工具 |
有以下几种方式安装Istio:
- 使用install/kubernetes文件夹中的istio-demo.yaml进行安装;
- 使用Helm template渲染出Istio的YAML安装文件进行安装;
- 使用Helm和Tiller方式进行安装。
课程中使用的是使用install/kubernetes文件夹中的istio-demo.yaml进行安装
2.1 快速部署Istio
Kubernetes CRD介绍
比如Deployment/Service/etc等资源是kubernetes本身就支持的类型,除了这些类型之外kubernetes还支持资源的扩展,说白了就是可以自定义资源类型,如果没有CRD的支持的话,istio一些资源类型是创建不成功的
#crds.yaml路径: istio-1.0.6/install/kubernetes/helm/istio/templates/crds.yaml # 执行 kubectl apply -f crds.yaml # 统计个数 kubectl get crd -n istio-system | wc -l
Kubernetes平台对于分布式服务部署的很多重要的模块都有系统性的支持,借助如下一些平台资源可以满足大多数 分布式系统部署和管理的需求,但是在不同应用业务环境下,对于平台可能有一些特殊的需求,这些需求可以抽象为Kubernetes的扩展资源,而 Kubernetes的CRD(CustomResourceDefifinition)为这样的需求提供了轻量级的机制
执行安装命令
(1)根据istio-1.0.6/install/kubernetes/istio-demo.yaml创建资源
kubectl apply -f istio-demo.yaml # 会发现有这么多的资源被创建了,很多很多 ,里面的命名空间用的是istio-system
2)查看核心组件资源
kubectl get pods -n istio-system kubectl get svc -n istio-system
可以看到有3个是completed,其它的组件都必须是running, completed表示的是用的是k8s里面JOB资源,表示这个任务已经执行结束了可以看到比如citadel有了,pilot有了,sidecar也有了,其它的比如ingress网关都有了,监控也有了
2.2 回顾K8S组件以及使用
回顾课程涉及到的kubernetes组件
2.2.1 Deployment
一旦运行了 Kubernetes 集群,就可以在其上部署容器化应用程序。 为此,需要创建 Kubernetes Deployment 配置。 Deployment 负责 Kubernetes 如何创建和更新应用程序的实例。 创建 Deployment 后,Kubernetes master 将应用程序实例调度到集群中的各个节点上。
创建nginx_deployment.yaml文件
apiVersion: apps/v1 ## 定义了一个版本 kind: Deployment ##k8s资源类型是Deployment metadata: ## metadata这个KEY对应的值为一个Maps name: nginx-deployment ##资源名字 nginx-deployment labels: ##将新建的Pod附加Label app: nginx ##一个键值对为key=app,valuen=ginx的Label。 spec: #以下其实就是replicaSet的配置 replicas: 3 ##副本数为3个,也就是有3个pod selector: ##匹配具有同一个label属性的pod标签 matchLabels: ##寻找合适的label,一个键值对为key=app,value=nginx的Labe app: nginx template: #模板 metadata: labels: ##将新建的Pod附加Label app: nginx spec: containers: ##定义容器 - name: nginx ##容器名称 image: nginx:1.7.9 ##镜像地址 ports: - containerPort: 80 ##容器端口
(1)执行资源文件命令
kubectl apply -f nginx_deployment.yaml
(2)查看pod
kubectl get pods 查看pod详情 kubectl get pods -o wide
(3)查看deployment命令
kubectl get deployment
(4)查看deployment详情命令
kubectl get deployment -o wide
2.2.2 Labels and Selectors
顾名思义,就是给一些资源打上标签的
labels
当资源很多的时候可以用可以用labels标签来对资源分类
apiVersion: v1 kind: Pod metadata: name: nginx-pod labels: app: nginx # 表示名称为nginx-pod的pod,有一个label,key为app,value为nginx。 #我们可以将具有同一个label的pod,交给selector管理
selectors
如果我想使用这个标签里面的k8s资源,那么需要用到k8s里面selector组件,用selector来匹配到特定的的label
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: # 定义了一个labels,key=app,value=nginx app: nginx spec: replicas: 3 selector: # 用selector匹配具有同一个label属性的pod标签 matchLabels: app: nginx
查看pod的label标签命令:
kubectl get pods --show-labels
2.2.3 Namespace
命名空间就是为了隔离不同的资源。比如:Pod、Service、Deployment等。可以在输入命令的时候指定命名空间`-n`,如果不指定,则使用
查看一下当前的所用命名空间:kubectl get namespaces/ns
查看一下kube-system命名空间:kubectl get pods -n kube-system
(1)创建自己的namespacemy-namespace.yaml
apiVersion: v1 kind: Namespace metadata: name: myns
(2)执行命令:kubectl apply -f my-namespace.yaml
(3)查看命令
kubectl get ns
删除命名空间
kubectl delete namespaces 空间的名字
注意: 删除一个namespace会自动删除所有属于该namespace的资源。 default和kube-system命名空间不可删除。