基于kubernetes部署云原生微服务应用Online Boutique


配置kubernetes集群环境

创建三台华为云服务器,一台做k8s-master服务器,另外两台做node节点服务器。

对这三台服务器,执行以下相同命令

关闭swap:

swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab

关闭防火墙:

systemctl stop ufw
systemctl disable ufw
systemctl stop firewalld
systemctl disable firewalld

修改软件源:

编辑/etc/apt/sources.list

修改镜像源(阿里云/华为/清华园)

例如:

deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
apt-get update
apt-get upgrade

安装docker:

apt-get install docker.io

开机自启动

systemctl enable docker
systemctl daemon-reload
systemctl restart docker

对于master节点

配置master节点:

hostname k8s-master

wget https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg

apt-key add apt-key.gpg

安装kubernetes:

apt-get update && apt-get install -y apt-transport-https curl
apt-get install -y kubelet=1.17.2-00 kubeadm=1.17.2-00 kubectl=1.17.2-00 --allow-unauthenticated
kubeadm config images list

配置镜像:

换国内源

docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.17.17
docker tag  registry.aliyuncs.com/google_containers/kube-apiserver:v1.17.17 k8s.gcr.io/kube-apiserver:v1.17.17
docker rmi  registry.aliyuncs.com/google_containers/kube-apiserver:v1.17.17

docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.17.17
docker tag  registry.aliyuncs.com/google_containers/kube-controller-manager:v1.17.17 k8s.gcr.io/kube-controller-manager:v1.17.17
docker rmi  registry.aliyuncs.com/google_containers/kube-controller-manager:v1.17.17

docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.17.17
docker tag  registry.aliyuncs.com/google_containers/kube-scheduler:v1.17.17 k8s.gcr.io/kube-scheduler:v1.17.17
docker rmi  registry.aliyuncs.com/google_containers/kube-scheduler:v1.17.17

docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.17.17
docker tag  registry.aliyuncs.com/google_containers/kube-proxy:v1.17.17 k8s.gcr.io/kube-proxy:v1.17.17
docker rmi  registry.aliyuncs.com/google_containers/kube-proxy:v1.17.17

docker pull registry.aliyuncs.com/google_containers/pause:3.1
docker tag  registry.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
docker rmi  registry.aliyuncs.com/google_containers/pause:3.1

docker pull registry.aliyuncs.com/google_containers/etcd:3.4.3-0
docker tag  registry.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker rmi  registry.aliyuncs.com/google_containers/etcd:3.4.3-0

docker pull registry.aliyuncs.com/google_containers/coredns:1.6.5
docker tag  registry.aliyuncs.com/google_containers/coredns:1.6.5 k8s.gcr.io/coredns:1.6.5
docker rmi  registry.aliyuncs.com/google_containers/coredns:1.6.5
docker images

初始化master节点:

kubeadm init --pod-network-cidr=10.244.0.0/16

保存图中node节点加入master集群的指令:

kubeadm join……

切换为普通用户

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get pods --all-namespaces

如果coredns 处于pending状态

kubectl get nodes

发现master处于NotReady状态

需要部署pod network插件文件

kubectl apply -f /usr/local/src/kube-flannel.yml
kubectl get node

配置node节点:

hostname node1(node2)

同上操作

安装****kubernetes

wget https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg
apt-key add apt-key.gpg
apt-get update && apt-get install -y apt-transport-https curl
apt-get install -y kubelet=1.17.2-00 kubeadm=1.17.2-00 kubectl=1.17.2-00 --allow-unauthenticated

docker镜像换源
……

加入集群:

kubeadm join 192.168.0.202:6443 --token 09hdi2.ogp6wujqwvhmrisk \ --discovery-token-ca-cert-hash sha256:1cffed7c52b078773c1f128ef3b7ecfd00efda14cf2c408a324cc492bf94f523

可能出现的问题

<1>如果出现coredns网络异常,则可能需要部署网络插件

kubectl apply -f /usr/local/src/kube-flannel.yml

<2>如果出现

Error in configuration:

* unable to read client-cert /var/lib/kubelet/pki/kubelet-client-current.pem for default-auth due to open /var/lib/kubelet/pki/kubelet-client-current.pem: no such file or directory

* unable to read client-key /var/lib/kubelet/pki/kubelet-client-current.pem for default-auth due to open /var/lib/kubelet/pki/kubelet-client-current.pem: no such file or directory

则表示token过期,需要重新create及join

<3>如果出现

error execution phase preflight: couldn't validate the identity of the API Server: Get "https://192.168.xxx.xx:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

To see the stack trace of this error execute with --v=5 or higher

则可能是防火墙问题

<4>如果

W0706 10:27:55.181115   22817 loader.go:221] Config not found: /etc/kubernetes/admin.conf

The connection to the server localhost:8080 was refused - did you specify the right host or port?

发现 Node 节点只有 kubelet.conf 配置项,而没有admin.conf

切换为普通用户

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/kubelet.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Node节点配置完成,在master节点上执行

kubectl get node

如果k8s-master的状态是NotReady,可能是hostname k8s-master错误,和主机命名不一致

部署dashboard

将配置文件create-admin.yaml和kubernetes-dashboard-v2.0.3.yml上传到master节点,执行

kubectl apply -f create-admin.yaml
kubectl apply -f kubernetes-dashboard-v2.0.3.yml
kubectl get pod -o wide --all-namespaces

登录dashboard面板

获取token登录

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

安装并部署Istio

https://github.com/istio/istio/releases下载安装包,下载安装包之后解压

tar xf istio-1.8.5-linux-amd64.tar.gz

或者

curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.8.5 TARGET_ARCH=x86_64 sh -

添加到 path

vim /etc/profile

添加以下内容

export ISTIOCTL_HOME="/home/istio-1.8.5"
export PATH="$ISTIOCTL_HOME/bin:$PATH"

执行生效

source /etc/profile

验证安装成功

istioctl version

部署 Istio Operator

istioctl operator init

init 命令创建了 istio-operator 命名空间,并部署了 CRD、Operator Deployment 以及 operator 工作所需的其他资源。

要安装 Istio,必须先创建 IstioOperator 资源,并指定要使用的配置文件。

创建目录istioyaml,用来专门存放yaml文件

mkdir istioyaml
cd istioyaml/
vim istio-demo-profile.yaml

填入以下内容:

apiVersion: v1
kind: Namespace
metadata:
  name: istio-system
---
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: demo-istio-install
spec:
  profile: demo
kubectl apply -f istio-demo-profile.yaml

查看istio-system命名空间下的所有资源

kubectl get all -o wide -n istio-system

为了检查安装的状态,查看 istio-system 命名空间中的 Pod 的状态。

kubectl get pod -o wide -n istio-system

Istio安装完成后,创建一个命名空间online-boutique,新的项目就部署在online-boutique命名空间下,给命名空间online-boutique设置上 istio-injection=enabled 标签,启用sidecar 自动注入。

创建命名空间online-boutique

kubectl create ns online-boutique

切换命名空间

kubectl config set-context --current --namespace=online-boutique

让命名空间online-boutique启用sidecar 自动注入

kubectl label ns online-boutique istio-injection=enabled
kubectl get ns -l istio-injection --show-labels

部署 Online Boutique 应用

拉取项目

创建online-boutique目录,项目放在该目录

mkdir online-boutique
cd online-boutique/
git clone https://github.com/GoogleCloudPlatform/microservices-demo.git

配置镜像

cd microservices-demo/
cd release/

# 查看需要下载的镜像
grep image kubernetes-manifests.yaml

镜像换源,换为国内

sed -i 's/gcr.io/gcr.lank8s.cn/' kubernetes-manifests.yaml

创建 Kubernetes 资源

kubectl apply -f /home/online-boutique/microservices-demo/release/kubernetes-manifests.yaml -n online-boutique

检查所有 Pod 都在运行:

kubectl get pod -o wide

创建 Istio 资源

kubectl apply -f ./istio-manifests

获取访问地址

部署了一切后,就可以得到入口网关的 IP 地址并打开前端服务:

INGRESS_HOST="$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')"
echo "$INGRESS_HOST"
kubectl get service -n istio-system istio-ingressgateway -o wide

发现 EXTERNAL-IP 为 pending

kubectl edit  service istio-ingressgateway -n istio-system

添加外部IP

访问项目地址

Istio插件配置

Prometheus

Prometheus 是一个开源的监控系统和时间序列数据库。Istio 使用 Prometheus 来记录指标,跟踪 Istio 和网格中的应用程序的健康状况。

cd /home/istio-1.8.5/samples/addons/
grep image prometheus.yaml

安装prometheus需要用到两个镜像:

jimmidyson/configmap-reload:v0.4.0 和 prom/prometheus:v2.21.0

在k8s的node节点拉取所需镜像

docker pull jimmidyson/configmap-reload:v0.4.0
docker pull prom/prometheus:v2.21.0

安装prometheus

kubectl apply -f /home/istio-1.8.5/samples/addons/prometheus.yaml

查看部署状态

kubectl get deploy -n istio-system

kubectl get service -n istio-system -o wide

prometheus的service的类型为ClusterIP,外部环境访问不了

修改prometheus这个service的类型为NodePort,这样外部环境就可以访问prometheus了

把type: ClusterIP 修改为 type: NodePort即可

kubectl edit service prometheus -n istio-system

之后可以根据ip加端口号访问该服务

Grafana

Grafana 是一个用于分析和监控的开放平台。Grafana 可以连接到各种数据源,并使用图形、表格、热图等将数据可视化。通过强大的查询语言,你可以定制现有的仪表盘并创建更高级的可视化。

通过 Grafana,我们可以监控 Istio 安装和服务网格中运行的应用程序的健康状况。

我们可以使用 grafana.yaml 来部署带有预配置仪表盘的 Grafana 示例安装。该 YAML 文件在 Istio 安装包的 /samples/addons 下。

确保在部署 Grafana 之前部署 Promeheus 插件,因为 Grafana 使用 Prometheus 作为其数据源。

cd /home/istio-1.8.5/samples/addons
grep image grafana.yaml

在k8s的node节点拉取所需镜像

docker pull grafana/grafana:7.2.1

安装grafana

kubectl apply -f /home/istio-1.8.5/samples/addons/grafana.yaml

查看部署状态

kubectl get pod -n istio-system

kubectl get service -n istio-system -o wide

同上

可以看到grafana这个service的类型为ClusterIP,外部环境访问不了

修改grafana这个service的类型为NodePort,这样外部环境就可以访问grafana了

把type: ClusterIP 修改为 type: NodePort即可

kubectl edit service grafana -n istio-system

之后可以根据ip加端口号访问该服务

Kiali

在kubernetes中为Istio配置Kiali,实现Istio服务网格的可视化,为Online Boutique项目提供服务拓扑图、全链路跟踪、指标遥测、配置校验、健康检查等功能。

cd /home/istio-1.8.5/samples/addons/
kubectl apply -f kiali.yaml
kubectl get pod -n istio-system

同样需要把type: ClusterIP 修改为 type: NodePort

Jaeger

Jaeger 是Uber推出的一款开源分布式追踪系统,兼容OpenTracing API。分布式追踪系统用于记录请求范围内的信息,包括一次调用的服务链路以及每个服务的延时,能够帮助我们很好的分析微服务间链路调用的错误及瓶颈。

cd /home/istio-1.8.5/samples/addons/
kubectl apply -f jaeger.yaml

kubectl get service -n istio-system

同样需要把type: ClusterIP 修改为 type: NodePort

之后可以根据ip加端口号访问该服务

参考

[1] https://www.cnblogs.com/boshen-hzb/p/10679863.html  istio实现对外暴露服务

[2] https://www.cnblogs.com/fenjyang/p/14417494.html K8S线上集群排查,实测排查Node节点NotReady异常状态

[3] https://www.cnblogs.com/renshengdezheli/p/16841875.html#32-kubernetes%E9%9B%86%E7%BE%A4%E7%8E%AF%E5%A2%83 Istio项目实际案例——Online Boutique


文章作者: Aiaa
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Aiaa !
  目录