使用kubeadm搭建k8s集群与高可用


1.0	首次撰写		
 
目 录
1 k8s简介	1
2 开始前的准备工作	错误!未定义书签。
3 安装kubeadm	3
3.1 安装kubeadm、kubelet、kubectl命令	3
3.2 安装网络组件	6
4 安装、	配置kubelet服务	7
4.1 下载kubelet	8
4.2 配置kubelet	9
5 初始化主节点	11
5.1 初始化	错误!未定义书签。
5.2 问题	12
5.3 通过本文档提供镜像解决	13
5.4 通过翻墙访问google镜像仓库解决	16
5.5 初始化完成	20
6 为主节点安装网络插件	22
7 加入子节点	22
8 一个java web示例	23
8.1 准备镜像与文件	23
8.2 . kubernetes的yml	错误!未定义书签。
8.3 部署java web示例	错误!未定义书签。
8.4 验证	错误!未定义书签。
9 . Ingress负载(非重点)	29
9.1 安装ingress	29
9.2 部署ingress	33
9.3 测试jave ee示例	34
9.4 . ingress使用主机网络	35
9.5 . ingress总结	37
1	k8s简介
首先,k8s是kubernetes的简称,其官方地址为https://kubernetes.io/。如果之前你接触过docker的话,那么可以认为kubernetes是docker的升级版,其用来管理docker创建的容器,当然也可以实现与docker相似的功能,并且,k8s是建立在docker之上的。至于docker,请参考docker相关文档,以下不会解释任何docker相关的知识。下面开始介绍k8s的使用。
2	前期工作及介绍
2.1	环境搭建
系统 centos7.0
三台服务器:192.168.221.135/139/140
文档采用目前最新的k8s版本v1.10.2(以后可能会升级,但此处的描述可能不会同步)
文档中提到的相关下载可能需要翻墙才可以正常下载。(在线安装,真实客户现场安装推荐离线安装)
pod资源:无需理解其具体含义,就和java会生成jar包、war包是一个概念,它只是一个名词而已
2.2	前期工作
135139140三台服务器都需要做此工作
进入opt目录
        cd /opt/
    创建bin目录
mkdir bin

在这里插入图片描述

三台服务器关闭selinux
setenforce 0
在这里插入图片描述

三台服务器开放防火墙开放端口
4789/tcp、7946/tcp、7946/udp、2377/tcp、6443/tcp 10250-10252/tcp 2379-2380/tcp 10255/tcp 30000-32767/tcp。
查看已经开放端口列表
>      firewall-cmd --list-port
     开放端口
    firewall-cmd --add-port 6443/tcp
     firewall-cmd --add-port 10250-10250/tcp
>firewall-cmd --add-port 2379-2380/tcp
firewall-cmd --add-port 10255/tcp
firewall-cmd --add-port 30000-32767/tcp
firewall-cmd --add-port 10250-10252/tcp

在这里插入图片描述

三台服务器增加防火墙规则
执行以下命令开放vrrp协议(keepalived主从通信需此协议)
>firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

在这里插入图片描述

清空iptables规则表
>iptables -F

在这里插入图片描述

iptables -t nat -F

在这里插入图片描述

3	安装kubeadm
135139140三台服务器都需要做以下工作
首先是官方安装文档https://kubernetes.io/docs/setup/independent/install-kubeadm/
然后,下面是安装过程。
3.1	安装kubeadm、kubelet、kubectl命令
>进入/opt/bin/目录
cd /opt/bin/
俩种安装方式:
1.	离线安装(推荐)
上传kubeadm,kubelet,kubectl文件到当前目录下

在这里插入图片描述

2.在线安装:下载kubeadm相关内容(在线下载不推荐)
执行以下命令
>cd /opt/bin/
RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)"
curl -L --remote-name-all https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/amd64/{kubeadm,kubelet,kubectl}
给与执行权限
chmod +x {kubeadm,kubelet,kubectl}

在这里插入图片描述

如果没有curl命令或因其他原因无法使用curl的话,请直接使用下面的地址分别下载(根据实际情况,可能需要代理或翻墙),当然也可直接使用本示例提供的文件。
https://storage.googleapis.com/kubernetes-release/release/v1.10.2/bin/linux/amd64/kubeadm
https://storage.googleapis.com/kubernetes-release/release/v1.10.2/bin/linux/amd64/kubelet
https://storage.googleapis.com/kubernetes-release/release/v1.10.2/bin/linux/amd64/kubectl
下载完成后,会有三个文件,分别是kubeadm  kubectl  kubelet,此时,如果你和我一样使用的是/opt/bin目录,而且此路径不属于PATH路径的话,需要配置PATH。
进入 ~目录
cd ~
编辑配置文件

vi .bashrc

在这里插入图片描述

添加如下命令:
export PATH=$PATH:/opt/bin

在这里插入图片描述

退出,保存。
这里简单说明下上述三个文件。
kubeadm:用于k8s节点管理(比如初始化主节点、集群中加入子节占为、移除节点等)。
kubectl:用于管理k8s的各种资源(比如查看logs、rs、deploy、ds等)。
kubelet:k8s的服务。
至此,kubeadm三个主要的命令就安装好了。
3.2	安装网络组件
> 创建opt/cni/bin/目录
mkdir -p /opt/cni/bin/
进入此目录
cd /opt/cni/bin/
上传网络组件包
查看是否上传成功

在这里插入图片描述

进入此目录
cd /opt/cni/bin/
俩种方式:
>1.	在线下载(不推荐)
执行以下命令
CNI_VERSION="v0.6.0"
curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-amd64-${CNI_VERSION}.tgz" | tar -C /opt/cni/bin -xz
同样的,如果curl命令无法使用,请自行下载(下载时请不要忘记替换版本号)。
2.	离线安装(推荐)
查看是否上传成功
解压
tar zxvf cni.tar.gz

在这里插入图片描述

查看解压后文件
ll
删除此压缩包
rm -rf cni.tar.gz

在这里插入图片描述

至此,网络组件也安装完成。
4	安装、	配置kubelet服务
135139140三台服务器都需要做此工作
以上已经安装了kubeadm运行所需的基本命令以及网络组件。现在需要安装、配置kubelet运行所需的服务。
4.1	Kubelet安装
安装俩种方式
1.	离线安装
进入etc/systemd/system
cd /etc/systemd/system
上传所需文件
```![在这里插入图片描述](https://img-blog.csdnimg.cn/20190402194402982.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI4NTEzODAx,size_16,color_FFFFFF,t_70)

```python
查看文件是否上传
ll

在这里插入图片描述

2.	在线安装(不推荐)
分别执行以下命令:
RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)"
curl -sSL "https://raw.githubusercontent.com/kubernetes/kubernetes/${RELEASE}/build/debs/kubelet.service" | sed "s:/usr/bin:/opt/bin:g" > /etc/systemd/system/kubelet.service
mkdir -p /etc/systemd/system/kubelet.service.d
curl -sSL "https://raw.githubusercontent.com/kubernetes/kubernetes/${RELEASE}/build/debs/10-kubeadm.conf" | sed "s:/usr/bin:/opt/bin:g" > /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
同理,如果curl命令无法使用,请使用下面的地址分别下载
https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.2/build/debs/kubelet.service
https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.2/build/debs/10-kubeadm.conf
同样的,版本号请根据实际情况更改。同时将单独下载的10-kubeadm.conf文件放入/etc/systemd/system/kubelet.service.d/目录中,目录不存在请自行创建。
4.2	配置kubelet
编辑配置文件
vi kubelet.service.d/10-kubeadm.conf

在这里插入图片描述

编辑
Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"

# Defaults are "cgroupfs" for Debian/Ubuntu/OpenSUSE and "systemd" for Fedora/CentOS/RHEL
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"

在这里插入图片描述

可以看到上图两处画线的地方,第一处中的--cni-bin-dir=/opt/cni/bin就是之前安装的网络组件的目录。
而第二处中有一段注释为:
# Defaults are "cgroupfs" for Debian/Ubuntu/OpenSUSE and "systemd" for Fedora/CentOS/RHEL。
意思是根据你所使用的系统,--cgroup-driver=systemd的默认值会有所不同,
而我们使用的是centos所以这个值要改为systemd。
同时,该行注释上还有一段注释
# Value should match Docker daemon settings.
意思是该值应该与docker配置的值匹配。
所以我们也需要对docker进行配置:
编辑/etc/docker/daemon.json文件(不存在请自行创建)
vi /etc/docker/daemon.json
添加如下信息
"exec-opts": ["native.cgroupdriver=systemd"]

在这里插入图片描述

重启docker。
systemctl restart docker
启动kubelet并设置为开机自启
systemctl start kubelet&&systemctl enable kubelet

在这里插入图片描述

此时,kubelet可能会无法正常启动,这是因为kubelet配置中的一些路径与证书现在还不存在导致的。这也是我们下面需要完成的功能,这里无需理会其启动状态。
5	初始化主节点(135)
在135上初始化主节点
5.1	初始化
初始化主节点
kubeadm init --kubernetes-version v1.10.2 --pod-network-cidr 10.244.0.0/16
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190402194440886.png)
关于kubeadm init的详细信息,请使用kubeadm init --help查看。
这里只作简单说明,--kubernetes-version参数指定版本号,如不指定,可能会发生错误。
而--pod-network-cidr参数指定kubeadm的子网号,
该子网号用于在kubeadm运行时,分配地址到各个pod、节点,以便完成它们之间的通信。
还要注意的是:--pod-network-cidr参数是否有用取决于用户选取的网络插件,
因这里我们采用的是flannel,其必须指定该参数,关于flannel的说明,后续章节会有说明。
主节点初始化时默认会在/etc/kubernetes下生成k8s运行所需的配置文件以及证书文件,
这也些文件中也包括kubelet运行所需要的证书等。所以这里也解决了上一节最后的kubelet无法启动的问题。
swap错误,关掉swap
swapoff -a
重新初始化
kubeadm init --kubernetes-version v1.10.2 --pod-network-cidr 10.244.0.0/16

在这里插入图片描述

5.2	问题
至此,k8s仍然不一定会成功运行。如图

在这里插入图片描述

如果你到这一步时也一直在等待而没有任何响应的话(大概超过30秒则说明有问题),
说明缺少k8s运行所需的基础镜像(这个问题通常都是发生在第一次初始化时)。
是的,k8s运行是需要一些docker基础镜像的,这些基础镜像承担了k8s运行所需的基础功能,没有它们,k8s是无法工作的。
而这些镜像默认是需要在google的容器中拉取的,所以,你懂的。
5.3	通过本文档提供镜像解决
135139140三台服务器都需要做此工作
离线安装
进入come目录
cd /home/
创建k8s目录
mkdir k8s
进入k8s目录
cd k8s/
上传文件到当前目录

在这里插入图片描述

查看是否上传
ll

在这里插入图片描述

进入kubeadm-required目录
cd kubeadm-required/
执行
for i in `ls`;do docker load -i $i;done

在这里插入图片描述

再次初始化
kubeadm init --kubernetes-version v1.10.2 --pod-network-cidr 10.244.0.0/16


在这里插入图片描述

报错,端口没有永久开启
查看防火墙端口
firewall-cmd --list-port
4789/tcp 7946/tcp 2377/tcp 2376/tcp 7946/udp 27017/tcp
firewall-cmd --get-active-zones
firewall-cmd --zone=public --add-port=6443/tcp --permanent
firewall-cmd --zone=public --add-port=10250-10252/tcp --permanent
firewall-cmd --zone=public --add-port=2379-2380/tcp --permanent
firewall-cmd --zone=public --add-port=10255/tcp --permanent
firewall-cmd --zone=public --add-port=30000-32767/tcp --permanent
重新加载防火墙
firewall-cmd --reload

在这里插入图片描述

重新初始化
kubeadm init --kubernetes-version v1.10.2 --pod-network-cidr 10.244.0.0/16

在这里插入图片描述

还是报错,关掉swap
swapoff -a
重设kubeadm
kubeadm reset


在这里插入图片描述

再次初始化
kubeadm init --kubernetes-version v1.10.2 --pod-network-cidr 10.244.0.0/16

在这里插入图片描述

5.4	通过翻墙访问google镜像仓库解决(在线安装不推荐)
在拉取镜像前,我们首先要知道需要拉取哪些镜像。这些可以在/var/log目录下的messages日志中找到(注意messages仅记录当天的,如果你是昨天发生的问题,请查看“messages-对应日期”例如messages-20180502就表示201852日的messages日志)。可以通过以下命令查看下结构 。
cd /var/log/
ls

在这里插入图片描述

至此,我们有好几种方式来查看日志vi也好cat也罢,使用什么取决于你自己。这里我使用下面的命令
grep -rn "gcr" messages

在这里插入图片描述

我们可以看到,有非常多的信息,但是很多都是重复的。
我们只要查看和镜像相关的内容即可(错误描述不一定全都一样,但是它们都会与镜像相关),
通过错误信息,我们很容易的看出是因为缺少哪些镜像。使用以下方式解决。
使用代理工具,或者VPN。
如果使用这些工具仍然无法自动拉取镜像的话,
我们可以手动拉取镜像(这也是我所采用的方法,步骤如下)。
首先,
使用代理、VPN等翻墙工具访问google镜像仓库https://console.cloud.google.com/gcr/images/google-containers?project=google-containers。如图

在这里插入图片描述
然后,搜索日志中的镜像名称,如图
在这里插入图片描述
点击需所需镜像即可选择对应版本,如图
在这里插入图片描述

选择好版本之后,点击显示拉取命令,点击复制,点击“在 Cloud Shell 中运行”,如图(图中1、2、3表示点击顺序)
在这里插入图片描述
之后,会自动的打开一个google的控制台。如果控制台中没有显示刚刚复制的命令,那么我们手动粘贴进去。然后执行那个命令。如图
在这里插入图片描述

现在,我们把这个镜像上传到docker hub或其它公有云仓库中。
这里我们选择前者。
执行如下命令
docker tag gcr.io/google-containers/kube-scheduler-amd64:v1.10.2 huxizhun/get-started:kube-scheduler-amd64-v1.10.2
docker push huxizhun/get-started:kube-scheduler-amd64-v1.10.2

在这里插入图片描述

 可以看到,上传成功。当然,使用这组命令的前提是你需要有自己的docker hub账号,并且修改分支路径与push路径为你自己的docker hub仓库路径
到这里,我们就可以去我们自己的docker服务器上拉取镜像了,在我们自己的服务器上执行如下命令
docker pull huxizhun/get-started:kube-scheduler-amd64-v1.10.2
docker tag huxizhun/get-started:kube-scheduler-amd64-v1.10.2 k8s.gcr.io/kube-scheduler-amd64:v1.10.2
docker image rm huxizhun/get-started:kube-scheduler-amd64-v1.10.2
简单说明下三条命令:
第一条:从docker hub上拉取上传的镜像
第二条:将镜像的名称改为k8s所需的镜像名称(从日志中获取)
第三条:删除多余的本地镜像

在这里插入图片描述

至此,一个镜像下载完成。然后,我们执行以下命令
重置k8s主节点:kubeadm reset
清空日志:echo >/var/log/messages

在这里插入图片描述

之后,我们再回到第一步,初始化镜像,然后再根据日志查找下一个需要的镜像,如此反复直到kubeadm正常启动。
5.5	初始化完成
初始化成功

在这里插入图片描述

图中有两处画线的地方,这里简单解释下
第一处:说明已经很明显了,你只需要按照执行即可。
当然,如果你的$HOME/.kube目录已经存在,而且你当是root用户的话,只需要执行第二步即可。
文档中就是仅执行第二步,命令如下:

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config


第二处:这个语句是加入该主节点所需要的语句,建议保存好。
另外,可以看到两个画线之间还有一段说明,大概的意思就是需要为该集群部署一个网络。

因k8s的网络是作为一个pod资源单独安装的,所以这里它会有提示。
关于k8s网络的相关内容下一节会提到。本节只要k8s主节点启动即可。


查看状态

kubectl get po -n kube-system

在这里插入图片描述

这里你可能已经注意到kube-dns的状态为Pending。
这样也算成功启动吗?当然,因为就像之前提到的,k8s的网络插件是需要单独安装的,
而这个kube-dns就是依赖于具体的网络插件的。
接下来,就安装网络插件,使其成为一个完整的master节点。
6	为主节点安装网络插件
k8s支持多种网络插件,
其官方说明为:https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#pod-network。
(请复制地址到浏览器打开)这里我使用的是flannel,
其官方文档为https://github.com/coreos/flannel。
这里,只需要执行如下命令即可。


kubectl apply -f \
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

查看状态
kubectl get po -n kube-system

在这里插入图片描述

7	加入子节点
139140俩台服务器都需要做以下工作
假设将139作为子节点加入到135中。
在139上先关掉swap
swapoff -a
执行之前主节初始化后生成的语句。
kubeadm join 192.168.221.135:6443 --token twp8aj.cgrxrb4wz36dzxdq --discovery-token-ca-cert-hash sha256:c117fc66db7a82e2a30810d9aa49fc4098797c0b3eae0d522cc976ca53ea8d42

在这里插入图片描述

成功加入子节点。
在140服务器上同样也做上述的工作
在主节点上通过命令kubectl get no查看节点状态(需要一定时间)
kubectl get no

在这里插入图片描述

8	一个java web示例
经过上面几节,我们已经成功创建了一个主节点的集群。本节将通过一个示例,来看下集群的效果。
8.1	准备镜像与文件
在135139140上执行docker load -i tocmat.tar(tomcat.tar在随文档一起发布的文件夹中)命令,如果已经存在qyzhcaofei/ex:tomcat9_8089镜像,则略过此步。
查看镜像列表
docker images

在这里插入图片描述进入home目录

cd /home/
创建kubernetes文件
mkdir kubernetes

在这里插入图片描述

进入kubernetes目录
cd kubernetes/

在这里插入图片描述

创建j2eetest目录
mkdir j2eetest
将docker-web-test.war  j2eetest-service.yml  j2eetest.yml三个文件放入135139140/home/kubernetes/j2eetest目录中

在这里插入图片描述

进入j2eetest目录
cd j2eetest/
查看
ll

在这里插入图片描述

8.2	. kubernetes的yml
在进行下一步操作之前,先来大概了解下k8s的yaml描述。
首先是官方地址https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.10/
然后简单说下别的示例中的两个yml文件。
j2eetest.yml:如图

在这里插入图片描述

本文中将上述镜像改为:
qyzhcaofei/ex:tomcat9_8089
图中最后提到了k8s挂载的内容,这是官方文档https://kubernetes.io/docs/concepts/storage/volumes/
j2eetest-service.yml:如图

在这里插入图片描述

8.3	部署java web示例
现在我们就可以创建我们的第一个示例了
创建
kubectl create -f j2eetest.yml -f j2eetest-service.yml
查看状态
kubectl get po,svc --all-namespaces -o wide

在这里插入图片描述

我们看到三个pod全部步署到了139,140中。
这是因为k8s的主节点默认仅仅是调度资源,不参与实际的工作任务。
可以通过执行以下命令来使主节点参与到实际的工作任务中。

kubectl taint nodes --all node-role.kubernetes.io/master-
 
看到发生了一个错误,那是因为指定--all参数导至的,因为--all参数试图在所有节点上执行操作,
但是子节点是没有该信息的,
所以会发生错误,但是我们可以看到主节点已经成功执行了,所以不用理会该错误。
现在,删除pod使其自动重新分配。
按以下顺序执行命令


查看状态
kubectl get po,svc --all-namespaces -o wide

在这里插入图片描述

删除pod使其自动重新分配
kubectl delete po/jee8089-78f4fc578d-xg4c9

在这里插入图片描述再次查看状态

kubectl get po,svc --all-namespaces -o wide

在这里插入图片描述

8.4	验证
浏览器访问http://192.168.221.135:31772/或curl http://192.168.221.135:31772/

在这里插入图片描述

成功。
浏览器访问http://192.168.221.139:31772/或curl http://192.168.221.139:31772/

在这里插入图片描述

成功。
浏览器访问http://192.168.221.140:31772/或curl http://192.168.221.140:31772/
在这里插入图片描述

9	. Ingress负载(非重点)
上面已经简单完成了k8s的单节点集群工作,现在我们加以加入负载均衡器以分担各节点的压力。负载均衡器的选择有很多,nginx,haproxy等。这里我们使用k8s官方指定的ingress(https://kubernetes.io/docs/concepts/services-networking/ingress/原理就是nginx)。其github地址为https://github.com/kubernetes/ingress-nginx。文档地址为https://kubernetes.github.io/ingress-nginx/
9.1	安装ingress
按以下顺序执行命令
	curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/namespace.yaml| kubectl apply -f -

在这里插入图片描述

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/default-backend.yaml| kubectl apply -f -

在这里插入图片描述

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/configmap.yaml| kubectl apply -f -

在这里插入图片描述

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/tcp-services-configmap.yaml| kubectl apply -f -

在这里插入图片描述

	curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/udp-services-configmap.yaml| kubectl apply -f -

在这里插入图片描述
\

	curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/rbac.yaml| kubectl apply -f -

在这里插入图片描述

	curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/with-rbac.yaml| kubectl apply -f -

在这里插入图片描述

安装完成,执行kubectl get po --all-namespaces查看pod启动情况,如图

在这里插入图片描述

 发现有两个ingress-nginx发生错误。执行kubectl describe po/default-http-backend-5c6d95c48-7vl4l -n ingress-nginx查看其中一个pod的问题,如图

在这里插入图片描述

 很明显,是镜像的问题。解决方法不再重复。
之后再次执行kubectl get po -n ingress-nginx -o wide发现仍然有问题。

在这里插入图片描述

 图中红色方块中可以看出未执行成功。
 (圆圈中的值应该为server253、这里是因为之前忘记截图了,该图是修改后的结果。:-D)
 
那么是什么原因导至一直不成功?是因为节点的问题。
因为经过以上小节的创建过程,现在S252、S253是一个集群环境,
而安装ingress-nginx是任意选择一个节点安装的,这里它被安装到了子节点S253中,但正确的结果应该是把它安装到主节点S252中。那么这里如何解决?两种解决方式。以下分别说明:
第一种:使用kubectl delete no server253删除子节点,然后再安装ingress-nginx,
之后再加入子节点,但显然该种方式并不好。
第二种:通过修改配置文件,使其主动安装到主节点。
还记得安装时执行的一系列语句吗?
这里首先将以上第二步中的default-backend.yaml文件与最后一步中的文件with-rbac.yaml下载,执行以下命令

curl -LO https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/default-backend.yaml
curl -LO https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/with-rbac.yaml


然后分别增加以下内容。
default-backend.yaml:

在这里插入图片描述

with-rbac.yaml:

在这里插入图片描述

现在,执行以下命令删除之前安装的default-backend与with-rbac
kubectl delete -f \
https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/default-backend.yaml \
 -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/with-rbac.yaml
然后安装修改后的文件,执行以下命令
kubectl apply -f default-backend.yaml -f with-rbac.yaml。
OK,执行kubectl get po --all-namespaces -o wide命令

在这里插入图片描述

看到ingress-nginx已经成功运行了。
9.2	部署ingress
现然我们可以部署一个ingress了。使用如命令
kubectl create -f jeetest-ingress.yml(jeetest-ingress.yml文件在随文档一起的文件夹中。同时,注意该内容依赖之前部署的javaee示例)

在这里插入图片描述
然后执行kubectl get ing命令进行查看
在这里插入图片描述

 这里发现HOSTS为*(任意主机地址),是因为我们没有配置主机(我这里配置主机后就无法访问了,目前仍然不知道为什么)。
 
 ADDRESS为空,但是可以访问(这里也不明白原因)。
 PORTS为80,这是ingress-nginx默认开放端口。
 如果想要修改以上信息,请查看以上提供的文档中的相关内容。
出现以上信息则说明部署成功了,在测试之前,对jeetest-ingress.yml文件稍作说明,如图

在这里插入图片描述

docker run --rm -d -p 8089:8089 \
-v /home/docker/tmtest/docker-web-test.war:\
/home/tomcat9/apache-tomcat-9.0.2/webapps/docker-web-test.war --name tmtest qyzhxz1/ex:tomcat9_8089,

在这里插入图片描述

如果不存在qyzhxz1/ex:tomcat9_8089镜像,请参考“一个java web示例”制作。
然后,使用docker container ls查看

在这里插入图片描述

可以看到,已经有一个容器在运行了。
最后,执行docker container inspect tmtest查看容器详情即可。
 
里面有id、路径等信息。
9.3	测试jave ee示例
执行kubectl get po --all-namespaces -o wide命令查看pod信息,如图

在这里插入图片描述

 图中红线标示的部分即我们需要的pod。可以看到IP为10.244.0.5(是k8s分配的IP)。执行curl http://10.244.0.5命令

在这里插入图片描述

 发生308错误,因为ingress-nginx默认需要https访问。执行命令curl -k https://10.244.0.5

在这里插入图片描述
发生502错误。在所有节点中执行iptables -F命令。之后再次尝试
在这里插入图片描述

 看到,可以得到正确结果了。
9.4	. ingress使用主机网络
首先,进行下一步说明之前,要说明的是本小节内容不仅仅适用于ingress,同样适用于其他k8s资源。

好了,还记得上一小节测试ingress时使用的地址吗?是10.244.0.5,而该地址是由k8s生成的,
随着每次ingress controller pod的重启,该地址都可能会发生改变,而且最重要的是,该地址是无法在外部网络被访问到的。
而解决这个问题有两种方案,如下。

第一种:将ingress controller发布为
服务,推荐这种方案,但是因为ingress的资源不是个人创建的,所以在不了解的情况下,失败了,同时因为时间问题,固不去深究。有兴趣可自行了解。

第二种:还记得部署ingress controller需要的with-rbac.yaml文件吗?是的,只需在该文件中增加如下内容即可,如图

在这里插入图片描述

 然后执行如下命令,重新加载ingress controller。
kubectl delete -f with-rbac.yaml

在这里插入图片描述

kubectl apply -f with-rbac.yaml

在这里插入图片描述

kubectl get po -n ingress-nginx -o wide

在这里插入图片描述

 看到地址已经改为主机地址了。
执行curl -k https://192.168.1.252查看结果

在这里插入图片描述
浏览器中访问https://192.168.1.252/查看结果
在这里插入图片描述

至此,ingress的简单示例就算是结束了,当然,它还有其他一些配置及使用方式等,请自行查阅相关文档。
9.5	. ingress总结
以上简单介绍了下ingress的使用。但个人认为ingress不是一个必须掌握的知识点。
因为我们完合可以制作自己的nginx镜像,然后发布为pod,用于替换ingress其繁杂的配置。
何况负载均衡器有很多种技术与方案来实现,只要选择合适的、我们熟悉的即可。
虽然ingress可能还有一些其它功能,但是其基于nginx配置的方式不会改变。
所以只要了解nginx,完全不需要花太多时间来学习ingress的使用,只需要了解即可。

Logo

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

更多推荐