使用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 前期工作
135、139、140三台服务器都需要做此工作
进入opt目录
cd /opt/
创建bin目录
mkdir bin
使用kubeadm搭建k8s集群与高可用

三台服务器关闭selinux
setenforce 0
使用kubeadm搭建k8s集群与高可用

三台服务器开放防火墙开放端口
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

使用kubeadm搭建k8s集群与高可用
三台服务器增加防火墙规则
执行以下命令开放vrrp协议(keepalived主从通信需此协议)

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
使用kubeadm搭建k8s集群与高可用

清空iptables规则表

iptables -F
使用kubeadm搭建k8s集群与高可用
iptables -t nat -F
使用kubeadm搭建k8s集群与高可用
3 安装kubeadm
135、139、140三台服务器都需要做以下工作
首先是官方安装文档https://kubernetes.io/docs/setup/independent/install-kubeadm/
然后,下面是安装过程。
3.1 安装kubeadm、kubelet、kubectl命令
进入/opt/bin/目录
cd /opt/bin/
俩种安装方式:

  1. 离线安装(推荐)
    上传kubeadm,kubelet,kubectl文件到当前目录下
    使用kubeadm搭建k8s集群与高可用
    2.在线安装:下载kubeadm相关内容(在线下载不推荐)
    执行以下命令

cd /opt/bin/
RELEASE="(curlsSLhttps://dl.k8s.io/release/stable.txt)"curlLremotenameallhttps://storage.googleapis.com/kubernetesrelease/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}
使用kubeadm搭建k8s集群与高可用
如果没有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
使用kubeadm搭建k8s集群与高可用
添加如下命令:
export PATH=$PATH:/opt/bin
使用kubeadm搭建k8s集群与高可用

退出,保存。
这里简单说明下上述三个文件。
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/
上传网络组件包
查看是否上传成功

使用kubeadm搭建k8s集群与高可用
进入此目录
cd /opt/cni/bin/
俩种方式:

  1. 在线下载(不推荐)
    执行以下命令
    CNI_VERSION=“v0.6.0”
    curl -L “https://github.com/containernetworking/plugins/releases/download/CNIVERSION/cnipluginsamd64{CNI_VERSION}/cni-plugins-amd64-{CNI_VERSION}.tgz” | tar -C /opt/cni/bin -xz
    同样的,如果curl命令无法使用,请自行下载(下载时请不要忘记替换版本号)。
  1. 离线安装(推荐)
    查看是否上传成功
    解压
    tar zxvf cni.tar.gz
    使用kubeadm搭建k8s集群与高可用
    查看解压后文件
    ll
    删除此压缩包
    rm -rf cni.tar.gz
    使用kubeadm搭建k8s集群与高可用
    至此,网络组件也安装完成。
    4 安装、 配置kubelet服务
    135、139、140三台服务器都需要做此工作
    以上已经安装了kubeadm运行所需的基本命令以及网络组件。现在需要安装、配置kubelet运行所需的服务。
    4.1 Kubelet安装
    安装俩种方式
  2. 离线安装
    进入etc/systemd/system
    cd /etc/systemd/system
    上传所需文件
    使用kubeadm搭建k8s集群与高可用
    查看文件是否上传
    ll
    使用kubeadm搭建k8s集群与高可用
  3. 在线安装(不推荐)
    分别执行以下命令:
    RELEASE="(curlsSLhttps://dl.k8s.io/release/stable.txt)"curlsSL"https://raw.githubusercontent.com/kubernetes/kubernetes/(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
    使用kubeadm搭建k8s集群与高可用
    编辑
    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”
使用kubeadm搭建k8s集群与高可用
可以看到上图两处画线的地方,第一处中的–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”]
使用kubeadm搭建k8s集群与高可用
重启docker。
systemctl restart docker
启动kubelet并设置为开机自启
systemctl start kubelet&&systemctl enable kubelet
使用kubeadm搭建k8s集群与高可用
此时,kubelet可能会无法正常启动,这是因为kubelet配置中的一些路径与证书现在还不存在导致的。这也是我们下面需要完成的功能,这里无需理会其启动状态。
5 初始化主节点(135)
在135上初始化主节点
5.1 初始化
初始化主节点
kubeadm init --kubernetes-version v1.10.2 --pod-network-cidr 10.244.0.0/16
使用kubeadm搭建k8s集群与高可用
关于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
使用kubeadm搭建k8s集群与高可用
5.2 问题
至此,k8s仍然不一定会成功运行。如图
使用kubeadm搭建k8s集群与高可用
如果你到这一步时也一直在等待而没有任何响应的话(大概超过30秒则说明有问题),说明缺少k8s运行所需的基础镜像(这个问题通常都是发生在第一次初始化时)。是的,k8s运行是需要一些docker基础镜像的,这些基础镜像承担了k8s运行所需的基础功能,没有它们,k8s是无法工作的。而这些镜像默认是需要在google的容器中拉取的,所以,你懂的。
5.3 通过本文档提供镜像解决
135、139、140三台服务器都需要做此工作
离线安装
进入come目录
cd /home/
创建k8s目录
mkdir k8s
进入k8s目录
cd k8s/
上传文件到当前目录
使用kubeadm搭建k8s集群与高可用
查看是否上传
ll
使用kubeadm搭建k8s集群与高可用
进入kubeadm-required目录
cd kubeadm-required/
执行
for i in ls;do docker load -i $i;done
使用kubeadm搭建k8s集群与高可用
再次初始化
kubeadm init --kubernetes-version v1.10.2 --pod-network-cidr 10.244.0.0/16
使用kubeadm搭建k8s集群与高可用
报错,端口没有永久开启
查看防火墙端口
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搭建k8s集群与高可用
重新初始化
kubeadm init --kubernetes-version v1.10.2 --pod-network-cidr 10.244.0.0/16
使用kubeadm搭建k8s集群与高可用
还是报错,关掉swap
swapoff -a
重设kubeadm
kubeadm reset
使用kubeadm搭建k8s集群与高可用
再次初始化
kubeadm init --kubernetes-version v1.10.2 --pod-network-cidr 10.244.0.0/16
使用kubeadm搭建k8s集群与高可用
5.4 通过翻墙访问google镜像仓库解决(在线安装不推荐)
在拉取镜像前,我们首先要知道需要拉取哪些镜像。这些可以在/var/log目录下的messages日志中找到(注意messages仅记录当天的,如果你是昨天发生的问题,请查看“messages-对应日期”例如messages-20180502就表示2018年5月2日的messages日志)。可以通过以下命令查看下结构 。
cd /var/log/
ls
使用kubeadm搭建k8s集群与高可用
至此,我们有好几种方式来查看日志vi也好cat也罢,使用什么取决于你自己。这里我使用下面的命令
grep -rn “gcr” messages
使用kubeadm搭建k8s集群与高可用
我们可以看到,有非常多的信息,但是很多都是重复的。我们只要查看和镜像相关的内容即可(错误描述不一定全都一样,但是它们都会与镜像相关),通过错误信息,我们很容易的看出是因为缺少哪些镜像。使用以下方式解决。
使用代理工具,或者v*n。如果使用这些工具仍然无法自动拉取镜像的话,我们可以手动拉取镜像(这也是我所采用的方法,步骤如下)。
首先,使用代理、v*n等翻墙工具访问google镜像仓库https://console.cloud.google.com/gcr/images/google-containers?project=google-containers。如图
使用kubeadm搭建k8s集群与高可用
然后,搜索日志中的镜像名称,如图
使用kubeadm搭建k8s集群与高可用
点击需所需镜像即可选择对应版本,如图
使用kubeadm搭建k8s集群与高可用

选择好版本之后,点击显示拉取命令,点击复制,点击“在 Cloud Shell 中运行”,如图(图中1、2、3表示点击顺序)
使用kubeadm搭建k8s集群与高可用
之后,会自动的打开一个google的控制台。如果控制台中没有显示刚刚复制的命令,那么我们手动粘贴进去。然后执行那个命令。如图
使用kubeadm搭建k8s集群与高可用
现在,我们把这个镜像上传到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
使用kubeadm搭建k8s集群与高可用
可以看到,上传成功。当然,使用这组命令的前提是你需要有自己的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所需的镜像名称(从日志中获取)
第三条:删除多余的本地镜像
使用kubeadm搭建k8s集群与高可用
至此,一个镜像下载完成。然后,我们执行以下命令
重置k8s主节点:kubeadm reset
清空日志:echo >/var/log/messages
使用kubeadm搭建k8s集群与高可用
之后,我们再回到第一步,初始化镜像,然后再根据日志查找下一个需要的镜像,如此反复直到kubeadm正常启动。
5.5 初始化完成
初始化成功
使用kubeadm搭建k8s集群与高可用
图中有两处画线的地方,这里简单解释下
第一处:说明已经很明显了,你只需要按照执行即可。当然,如果你的$HOME/.kube目录已经存在,而且你当是root用户的话,只需要执行第二步即可。文档中就是仅执行第二步,命令如下:
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
第二处:这个语句是加入该主节点所需要的语句,建议保存好。
另外,可以看到两个画线之间还有一段说明,大概的意思就是需要为该集群部署一个网络。因k8s的网络是作为一个pod资源单独安装的,所以这里它会有提示。关于k8s网络的相关内容下一节会提到。本节只要k8s主节点启动即可。
查看状态
kubectl get po -n kube-system
使用kubeadm搭建k8s集群与高可用
这里你可能已经注意到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
使用kubeadm搭建k8s集群与高可用
7 加入子节点
139、140俩台服务器都需要做以下工作
假设将139作为子节点加入到135中。
在139上先关掉swap
swapoff -a
执行之前主节初始化后生成的语句。
kubeadm join 192.168.221.135:6443 --token twp8aj.cgrxrb4wz36dzxdq --discovery-token-ca-cert-hash sha256:c117fc66db7a82e2a30810d9aa49fc4098797c0b3eae0d522cc976ca53ea8d42
使用kubeadm搭建k8s集群与高可用
成功加入子节点。
在140服务器上同样也做上述的工作
在主节点上通过命令kubectl get no查看节点状态(需要一定时间)
kubectl get no
使用kubeadm搭建k8s集群与高可用
8 一个java web示例
经过上面几节,我们已经成功创建了一个主节点的集群。本节将通过一个示例,来看下集群的效果。
8.1 准备镜像与文件
在135、139、140上执行docker load -i tocmat.tar(tomcat.tar在随文档一起发布的文件夹中)命令,如果已经存在qyzhcaofei/ex:tomcat9_8089镜像,则略过此步。
查看镜像列表
docker images

使用kubeadm搭建k8s集群与高可用进入home目录
cd /home/
创建kubernetes文件
mkdir kubernetes
使用kubeadm搭建k8s集群与高可用
进入kubernetes目录
cd kubernetes/
使用kubeadm搭建k8s集群与高可用
创建j2eetest目录
mkdir j2eetest
将docker-web-test.war j2eetest-service.yml j2eetest.yml三个文件放入135、139、140的/home/kubernetes/j2eetest目录中

使用kubeadm搭建k8s集群与高可用
进入j2eetest目录
cd j2eetest/
查看
ll
使用kubeadm搭建k8s集群与高可用
8.2 . kubernetes的yml
在进行下一步操作之前,先来大概了解下k8s的yaml描述。
首先是官方地址https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.10/
然后简单说下别的示例中的两个yml文件。
j2eetest.yml:如图
使用kubeadm搭建k8s集群与高可用
本文中将上述镜像改为:
qyzhcaofei/ex:tomcat9_8089
图中最后提到了k8s挂载的内容,这是官方文档https://kubernetes.io/docs/concepts/storage/volumes/
j2eetest-service.yml:如图
使用kubeadm搭建k8s集群与高可用
8.3 部署java web示例
现在我们就可以创建我们的第一个示例了
创建
kubectl create -f j2eetest.yml -f j2eetest-service.yml
查看状态
kubectl get po,svc --all-namespaces -o wide
使用kubeadm搭建k8s集群与高可用
我们看到三个pod全部步署到了139,140中。这是因为k8s的主节点默认仅仅是调度资源,不参与实际的工作任务。可以通过执行以下命令来使主节点参与到实际的工作任务中。
kubectl taint nodes --all node-role.kubernetes.io/master-

看到发生了一个错误,那是因为指定–all参数导至的,因为–all参数试图在所有节点上执行操作,但是子节点是没有该信息的,所以会发生错误,但是我们可以看到主节点已经成功执行了,所以不用理会该错误。
现在,删除pod使其自动重新分配。按以下顺序执行命令
查看状态
kubectl get po,svc --all-namespaces -o wide
使用kubeadm搭建k8s集群与高可用
删除pod使其自动重新分配
kubectl delete po/jee8089-78f4fc578d-xg4c9

使用kubeadm搭建k8s集群与高可用再次查看状态
kubectl get po,svc --all-namespaces -o wide
使用kubeadm搭建k8s集群与高可用
8.4 验证
浏览器访问http://192.168.221.135:31772/或curl http://192.168.221.135:31772/

使用kubeadm搭建k8s集群与高可用
成功。
浏览器访问http://192.168.221.139:31772/或curl http://192.168.221.139:31772/
使用kubeadm搭建k8s集群与高可用
成功。
浏览器访问http://192.168.221.140:31772/或curl http://192.168.221.140:31772/
使用kubeadm搭建k8s集群与高可用
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 -
使用kubeadm搭建k8s集群与高可用
 curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/default-backend.yaml| kubectl apply -f -
使用kubeadm搭建k8s集群与高可用
 curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/configmap.yaml| kubectl apply -f -
使用kubeadm搭建k8s集群与高可用
 curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/tcp-services-configmap.yaml| kubectl apply -f -
使用kubeadm搭建k8s集群与高可用
 curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/udp-services-configmap.yaml| kubectl apply -f -
使用kubeadm搭建k8s集群与高可用
 curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/rbac.yaml| kubectl apply -f -
使用kubeadm搭建k8s集群与高可用
 curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/with-rbac.yaml| kubectl apply -f -
使用kubeadm搭建k8s集群与高可用
安装完成,执行kubectl get po --all-namespaces查看pod启动情况,如图
使用kubeadm搭建k8s集群与高可用
发现有两个ingress-nginx发生错误。执行kubectl describe po/default-http-backend-5c6d95c48-7vl4l -n ingress-nginx查看其中一个pod的问题,如图
使用kubeadm搭建k8s集群与高可用
很明显,是镜像的问题。解决方法不再重复。
之后再次执行kubectl get po -n ingress-nginx -o wide发现仍然有问题。
使用kubeadm搭建k8s集群与高可用
图中红色方块中可以看出未执行成功。(圆圈中的值应该为server253、这里是因为本人之前忘记截图了,该图是修改后的结果。????)
那么是什么原因导至一直不成功?是因为节点的问题。因为经过以上小节的创建过程,现在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:
使用kubeadm搭建k8s集群与高可用
with-rbac.yaml:
使用kubeadm搭建k8s集群与高可用
现在,执行以下命令删除之前安装的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命令
使用kubeadm搭建k8s集群与高可用
看到ingress-nginx已经成功运行了。
9.2 部署ingress
现然我们可以部署一个ingress了。使用如命令
kubectl create -f jeetest-ingress.yml(jeetest-ingress.yml文件在随文档一起的文件夹中。同时,注意该内容依赖之前部署的javaee示例)。
使用kubeadm搭建k8s集群与高可用
然后执行kubectl get ing命令进行查看
使用kubeadm搭建k8s集群与高可用
这里发现HOSTS为*(任意主机地址),是因为我们没有配置主机(我这里配置主机后就无法访问了,目前仍然不知道为什么)。ADDRESS为空,但是可以访问(这里也不明白原因)。PORTS为80,这是ingress-nginx默认开放端口。如果想要修改以上信息,请查看以上提供的文档中的相关内容。
出现以上信息则说明部署成功了,在测试之前,对jeetest-ingress.yml文件稍作说明,如图
使用kubeadm搭建k8s集群与高可用
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,
使用kubeadm搭建k8s集群与高可用
如果不存在qyzhxz1/ex:tomcat9_8089镜像,请参考“一个java web示例”制作。
然后,使用docker container ls查看
使用kubeadm搭建k8s集群与高可用
可以看到,已经有一个容器在运行了。
最后,执行docker container inspect tmtest查看容器详情即可。

里面有id、路径等信息。
9.3 测试jave ee示例
执行kubectl get po --all-namespaces -o wide命令查看pod信息,如图
使用kubeadm搭建k8s集群与高可用
图中红线标示的部分即我们需要的pod。可以看到IP为10.244.0.5(是k8s分配的IP)。执行curl http://10.244.0.5命令
使用kubeadm搭建k8s集群与高可用
发生308错误,因为ingress-nginx默认需要https访问。执行命令curl -k https://10.244.0.5
使用kubeadm搭建k8s集群与高可用
发生502错误。在所有节点中执行iptables -F命令。之后再次尝试
使用kubeadm搭建k8s集群与高可用
看到,可以得到正确结果了。
9.4 . ingress使用主机网络
首先,进行下一步说明之前,要说明的是本小节内容不仅仅适用于ingress,同样适用于其他k8s资源。
好了,还记得上一小节测试ingress时使用的地址吗?是10.244.0.5,而该地址是由k8s生成的,随着每次ingress controller pod的重启,该地址都可能会发生改变,而且最重要的是,该地址是无法在外部网络被访问到的。而解决这个问题有两种方案,如下。
第一种:将ingress controller发布为服务,推荐这种方案,但是因为ingress的资源不是个人创建的,所以在不了解的情况下,失败了,同时因为时间问题,固不去深究。有兴趣可自行了解。
第二种:还记得部署ingress controller需要的with-rbac.yaml文件吗?是的,只需在该文件中增加如下内容即可,如图
使用kubeadm搭建k8s集群与高可用
然后执行如下命令,重新加载ingress controller。
kubectl delete -f with-rbac.yaml
使用kubeadm搭建k8s集群与高可用
kubectl apply -f with-rbac.yaml
使用kubeadm搭建k8s集群与高可用
kubectl get po -n ingress-nginx -o wide
使用kubeadm搭建k8s集群与高可用
看到地址已经改为主机地址了。
执行curl -k https://192.168.1.252查看结果
使用kubeadm搭建k8s集群与高可用
浏览器中访问https://192.168.1.252/查看结果
使用kubeadm搭建k8s集群与高可用
至此,ingress的简单示例就算是结束了,当然,它还有其他一些配置及使用方式等,请自行查阅相关文档。
9.5 . ingress总结
以上简单介绍了下ingress的使用。但个人认为ingress不是一个必须掌握的知识点。因为我们完合可以制作自己的nginx镜像,然后发布为pod,用于替换ingress其繁杂的配置。何况负载均衡器有很多种技术与方案来实现,只要选择合适的、我们熟悉的即可。虽然ingress可能还有一些其它功能,但是其基于nginx配置的方式不会改变。所以只要了解nginx,完全不需要花太多时间来学习ingress的使用,只需要了解即可。

相关文章: