开发者学堂课程【Kubernetes 入门实战演练2020版:Kubeadm 初始化流程简介及 dashboard v2.0.0-rc6部署】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/656/detail/10861
Kubeadm 初始化流程简介及 dashboardv2.0.0-rc6部署
内容介绍:
一、初始化过程
二、验证
三、创建容量测试网络
四、自托管
五、部署 web 服务 dashboard
一、初始化过程
通过 kubernetes 的工具部署了一个三节点的高可用K8s集群,那么接下来 K8s 集群怎样去使用呢。
目前为止还没有部署完,后面还有操作,我们把master节点和nodes节点加进来。
这个情况就说明你的所有操作与调用都是没问题的。接下来我们通过kubeadminit看,这个时候应该做的步骤就是在GitHub上面会有个链接。
这是早期的一个初始化过程,现在新版本也都一样,无论使用哪一个都很类似,这个页面是基于kubenetes1.9说的,跟新版本很类似,如果新版本的很笼统,在入门里面看,在官方文档里面,主页教程,看到这个会有一个安装的教程,搜索一下这个工具,在任务里面,安装工具,就有一个页面,然后包括集群管理,都有相关文档。
接下来看初始化页面,我们进行初始化还是通过课表kubeadm命令进行初始化,找到使用kubeadm进行证书管理,跳转网站,访问外网比较慢。
初始化证书还在下面,这个写的比较笼统,例如搭载高可用的kubeadm是怎样使用的,过程也都有,但是较笼统。初始化工作流kubeadminit通过执行以下步骤引导一个Kubemetesmaster节点:
1、在进行更改之前,运行一系列检查以验证系统状态。一些检查只会触发警告,有些检查会被视为错误井会退出kubeadm直到问题得到解决或用户指定了--skip-preflight-checks。比如说交换机或者跳过orl。
2、生成自签名的CA(或使用现有的CA、如果用户提供)为集群中的每个组件设置身份。
如使用自定义证书中所述,如果用户在通过--cert-dir配置的目景中(默认为/etc/kubernetes/pki)提供了自己的CA证书和(或)密钥,则跳过此步骤。
这个时候我们看一下,这时候初始化证书,到达什么地方,在/etc/kubernetes/pki里面就可以看到这时候给你生成的一堆证书,包括crt证书,etc证书,还有front-proxy证书。这些都是证书,kpi内部交互都是走证书,如果你听过手动器布置的
话,那么要给每个组件都放置证书,包括kube-proxy,要分发各种证书,这是网络组件的,都有证书,自己做相对麻烦,这里有kubeadm的时候,这个证书的签发就可以自动完成,这里面有一个配置文件,叫做kuberlet.conf,这个就是kuberlet的文件,之前讲过nginx节点是不会访问etc的,这时候就需要kuberlet去把自己的一些运行状态,去etc里面写文,需要上报给kuberlets管理端。
3、在/etc/kubernetes中为kubelet.controlel-manager和scheduler编写配置文件,让它们能够连接APIserver,每个文件都需要有自己的标识。同时还需要为管理用途编写名称为admin.conf的文件。
例如congtrol-manager,这个就是一个配置文件,将会把kubelet的初始配置信息写入/var/lib/kubelet/config/init/kubelet/文件中,然后进行设置,当然现在已经不用了,这个功能可以进行忽略掉,这些新功能一般不用,另外如果没有提供外etcd,也会为etcd生成一个额外的静态Podmanifest文件。
4、如果kubeadm的-feature-gates=DynamicKubeletConfig参数被启用,它将会把kubelet的初始配置信息写入/var/lib/kubelet/config/init/kubelet/文件中。参阅通过配置文件设置kubelet参数和在生活集群中重新配置节点kubelet获取更多关于Kubelet动态配置的信息。此功能现在默认处于禁用状态。因为它受featuregate控制,但预计在未来的版本中将成为默认功能。
5、为Apiserver.controllermanager和scheduler生成静态Pod的manifest文件。如果没有提供外部etcd,也会为etcd生成一个额外的静态Podmanifest文件。静态Pod的manifest文件将会写入/etc/kubernetes/manifest;kubelet监控这个目录以在启动时判断是否生成Pod。一旦控制平面Pod启动并运行,kubeadminit将会继续运行。某些文件里面,然后基于这个文件把所有的都串联起来,所以说这些创建的文件会被容器所加载,比方说鉴定地址,etc服务器等等,这是其中之一,还有好几个。
6、如果kubeadm的-feature-gates=DynamicKubeletConfig参数被启用,它将通过创建一个ConfigMap和一些RBAC规则来完成kubelet动态配置,这些规则让kubelet能够访问配置文件,并且更新节点以让Node.spec.configSource指向新创建的ConfigMap。此功能现在默认处于禁用状态因为它受featuregate控制,但预计在未来的版本中将成为默认功能。
7、将标签和tant应用到master节点,这样就不会有额外的工作负载运行在该节点上。当你getnode你就会发现,master都是ready,这个角色roles也
是显示master,然后我们可以手敲去进行,label··help,打标签,打完标签就进入了哪种功能。比如说亲和性和反亲和性都可以通过标签来实现。
8、生成token以让额外的node能够将它们自己注册到这个master,可以默认指定token--help,这就是token的管理密令,然后创建,删除,生成,list,这也是测试的一个过程,还有一个叫做dry-run,跟这个很类似,只是用作测试运行。
可以list一下token,看看现在有哪些,在过期前是可以使用的。过期就无法使用了,用不了就需要重新生成,dockerps节点加入后会启动一些文件,让这些容器运行起来,这个是bootstrap操作。
9、创建所有必需的配置以让node能够通过Bootstap-Tokens和TLSBootstrap机制来加入集群。
(1)编写一个ConfigMap来提供加入集群所需要的所有信息,并设置相关的RBAC访问规则;
(2)让BotstrapToken能够访问CSR鉴权API;
(3)为所有新的CSR请求配置auto-approval。
进行一个授权,如果没有自动做的话,你通过kubectlcsr进行一个授权,就类似于证书签名生成一个csr文件,如果自动应答,就会为所有新的CSR请求配置auto-approval,这个有利也有弊。
每一个都自动应答,这样安全性不高,为了安全性考虑,把权限控制好。
10、安装内部的DNS服务,并且通过APIserver插件组件。请注意,就算部署了DNS服务,但是在安装CNI之前它也不会被调度到node上。
这个DNS会在过程中显示,现在通过kubectlgetpod·A,查询所有的pod,现在看到的状态就是,都是running,都是运行的,然后alpha特性,一般不看。所以说每个Master上跑的服务都是一样的。
11.如果在调用kubeadminit时先启用alpha特性self-hosting(--feature-gates=SelfHosting=ture),那么基于静态Pod的控制平面将会转变为自托管控制面(self-hostedcntrol
plane)。
二、验证
初始化完成后再来验证所有的master节点,在验证时需要用到参数get,主要适用于验证pod、node、service及其他对象资源是否正常。get参数形式(-o|--output)中的-o可以改变输出结果,可以使用json、yaml、wide的方式输出,但是通过json与yaml不方便观看,而wide显示出的结果详细清楚:
想要查看service,输入kubectlgetservice,显示结果如图:想要查看详细信息,输入kubectlgetservice-owide,显示如图更加详细的信息输入kubectldescribeservice,此处的service是类型,可以是pod、node等,后面加要查看的对象名称,例如输入kubectldescribeservicekubernetes,显示结果如图
可以看到目前将这三个管理端作为后端服务器,即一旦访问到这个service地址,该service就会转到三个宿主机的6443端口,然后由宿主机上的6443端口进行处理响应。以上集群就创建完成,node、pod都正常,node节点也添加成功(所有节点都是ready状态)
三、创建容器测试网络
之后我们来创建容器测试网络创建一些容器以跨主机的形式进行测试,输入
kubectlrunnet-test1--image=alpine--replicas=3sleep360000,再来查看pod是否创建起来,输入kubectlgetpod还未创建完成,输入kubectlgetpod-owide发现ERRImagePull镜像拉取失败,来手动拉取:输入dockerpullalpine,可以配置镜像加速器进行
加速:
sudomkdir-p/etc/docker
sudotee/etc/docker/daemon.json<<-’EOF’
>{
>
“registry-mirrors”:[“
https://9916wlow.mirror.aliyuncs.co
m”]
>}
>EOF
{
“registry-mirrors”:[“
https://9916wlow.mirror.aliyuncs.co
m”
}
再输入sudosystemctldaemon-reload
sudosystemctlrestartdocker节点添加成功后需要到master验证,加速器配置完成后再输入dockerpullalpine,此处手动不使用托管。
四、自托管
关于托管的介绍可以在官网上查看:
从1.8版本开始,您可以实验性地创建一个自托管Kubernetes控制平面。这表示关键的组件如APIserver、controllermanager和scheduler都将以DaemonSetpods方式运行,DaemonSetPod通过
KubernetesAPI配置而不是通过Kubelet的静态文件配置。警告:自托管目前仍是alpha阶段,但有望在未来的版本中成为默认行为。
要创建自托管的集群,请传递--feature-gates=SelfHosting=true参数到kubeadminit。
警告:请参阅自托管的注意事项和局限性。1.8版本中的自托管有非常重大的局限性,特别是,如果没有人工干预,一个自托管的集群,无法在master节点重启后自动恢复,这些局限性有望在托管的alpha版本中会得解决,默认情况下,到自托管的控制平面的Pod需要依赖于从hostpath卷中载入的证书。除初始创建外,这些凭据不受kubeadm管理。您可以使用--feature-gates-StoreCertsInSecrets=true来从
Secret中读取控制证书,不过这个方式仍然处于实验阶段。在kubeadm1.8版本中,控制平面中自托管的部分并不包含etcd,它仍然运行在一个静态pod中。最好所有的管理端都要在我们自己手里,因为你不知道托管管理什么
东西,后期修改你都不知道,有些命令不支持,托管的时候很多参数
无法配置。
回到代码,查看下载完成,再来查看pod是否创建起来,输入kubectlgetpod发现显示结果处于Running状态,再来输入kubectlgetpod-owide可以看到pod运行在不同的宿主机上,现在要验证电脑启动了一个容器之后查看它是否可以访问别的容器以及你的容器是否可以访问外网。
输入kubectlexec,可以进入任何服务器,想要进入第一个容器,输入kubectlexec-it-net-test1-5fcc69db59-f7rgfsh,进入后再输入ifconfig就可以看到不同的容器,然后在容器中ping上别的容器,例如输入ping10.10.5.3,该步骤非常重要,无论使用什么方式布置的kubernetes,如果容器不能跨主机创建,相当于不能使用。
目前就是通过第一个节点上的容器去访问别的节点上的容器或者让容器可以相互访问。
检验内网是互通的后检验外网,输入ping223.6.6.6,不通ping一下网关,输入ping172.31.7.254,结果出不去宿主机,检查一下。该容器是跑到node1节点上,查看node1节点的参数,输入sysctl-a|grepforward,发现ipv4.ip_forward打开,再来输入ifconfig,发现是因为pod的地址未改,flannel中的地址段与pod不一致,退
出后输入cd,输入vimflannel.yml,可以看到此处地址是192,导致flannel的配置参数不正确,改为10.10.0.0/16,改完之后再来查看pod,输入vimkubeadm-init.yml,查看地址为10.10.0.0/16,再来执行命令
kubectlapply-fflannel.yml
kubectlexec-itnet-test1-5fcc69db59-f7rgfsh
结果还是不能访问,那就先删掉,然后再重新创建,输入kubectldelete-fflannel.yml,删除是需要去etc里面删除的,比较慢,删
完之后再重新创建。
kubectlapply-fflannel.yml创建完后等待pod状态跑起来
kubectlgetpod-A跑起来后再进入到容器中去验证
kubectlexec-itnet-test1-5fcc69db59-f7rgfsh
ifconfigping172.31.7.254
这个时候已经可以正常通过,在宿主机上通向网关,到达网关,就可以访问外网,此时再来输入ping223.6.6.6,通过后查看是否可以ping域名,是否可以请求外网的域名,需要看dns中是否有解析服
务,输入cat/etc/resolv.conf结果得到nameserver192.168.0.10,再输入pingwww.baidu.com
不能通过退出后查看输入ll
kubectlgetservice
kubectlgetservice-A
结果显示dns是192.168.0.10没问题,再来输入
ll
kubectlgetpod
kubectlgetpod-A
可以看到coredns运行正常,再来查看输入
vimkubeadm-init.yml
该文件也没有问题,再进入到容器中,输入
kubectlexec-itnet-test1-5fcc69db59-f7rgfsh
pingwww.baidu.com
地址不对,需要将kubeadm转到kubedns上,手动管理将参数改正确
ping192.168.0.10
地址是通的,再来装一个命令,输入
cat/etc/issue
apkaddtelnet
Ifconfig
尝试ping一个其他域名
pingwww.sina.com
成功,那么就是dns问题,输入
vi/etc/resolv.conf
先将dns临时改成阿里云的:
nameserver223.6.6.6
再来ping,输入pingwww.sina.com,发现在dns修改之后就通了,所以网络没有问题,那么dns怎么改呢?
输入kubectlgetpod
kubectlgetpod-A
先进行删除,输入kubectldeletepodcoredns-7f9c544f75-4wljr-nkube-system,删除后再来删除第二个此处删除后都会进行重建,此外dns也被保存在etc中,数据不会丢失
kubectldeletepodcoredns-7f9c544f75-q8fk9-nkube-system,再来输入kubectlgetpod-A会发现coredns又被重建,所以pod是删不掉的,再来进入pod中,输入kubectlexec-itnet-test1-5fcc69db59-f7rgfshpingwww.baidu.com
发现删完重建后通过,再来尝试pingwww.aliyun.com也通过再来将dns改回去,输入vi/etc/resolv.conf将dns由阿里云的改为自己的,将nameserver改为192.168.0.10改回去,再来输入pingwww.aliyun.compingwww.jd.com
发现都通过,再来退出换个网线,由第一个容器换到第三个容器中,输入
kubectlgetpod-A
kubectlexec-itnet-test1-5fcc69db59-vhctdsh
pingwww.baidu.com
结果通过,再来换一个容器,输入
kubectlexec-itnet-test1-5fcc69db59-m2p8vsh
pingwww.baidu,com
结果通过虽然可以正常使用访问了,但是你并不知道公网解析给转到了哪里,
DNS服务是可以指定去哪里转发的,但是现在我们不能配置,因为在创建时kubedns是自动装成的。
那么我们如何指定让kubedns或者coredns解析的域名不去公网,这是根本不合理的。解析出来的域名还有PowerDNS还有公司内部的dns服务。
内部的dns会解析数据库的域名或者harbor的域名,所以我们希望kubedns和coredns解析不了的域名可以转到powerdns,使用PowerDNS再返回公司内部的域名,如果PowerDNS解析不了的域名,再转去公网的域名,这样又不容易去处理了,但是也有解决方案不做
讲解。之前出现过一个问题,当kubedns或者coredns解析域名时都直接被
劫成公网地址,就是因为我们使用的是默认的dns,没有指向powerdns,所以域名解析出现了问题。
经过修改后先指向powerdns,然后再指向公网,这个时候网络也就没问题了。
刚刚出现的将dns删掉后重建就可以的问题可能是存在我们在初始化kubernets时没有在一定时间内把网络给部署好,也就是说网络有问题,因为网络是不能修改的,所以只能删除再进行部署,也就是相当于重启了,虽然说也可能是网络导致的问题,但是在部署过程中应该不会再碰到这种问题。
百度上显示的原因对我们来说不适用,dnsmasq我们并没有,输入systemctlstatusdnsmasq找不到该服务,我们需要去安装,如果安装了可能存在问题,若没有安装不可能存在该问题。
五、部署 web 服务 dashboard
登录github,然后搜索dashboard,可以看到有release,Dashboard的最新版本就是v2.0.0-rc6,这个版本是可以兼容1.17的,这也是我们为什么要讲解1.17的原因之一,但是dashboard兼容性不太好,可以在官网上看到目前最新kubernetes版本的1.17完全支持的版本范围,而1.14、1.15、1.16在兼容性上由于kubernetesAPI版本之间的重大更改,某些功能在Dashboard中可能无法正常工作。
rc5也只是支持1.17的版本,rc4也是,rc3也是,rc2只支持1.16,之前我们使用的版本是v1.10.1,这个版本可以支持1.8,1.9,1.10等多个版本,但是1.11、1.12中间的带值版本没有那种完全符合的,中间的几个版本就没有那种可以完全兼容的,但是也是部分可用,造成了一个尴尬的地步。
那么如何安装rc6呢?需要先下载镜像,输入dockerpullkubernetesui/dashboard:v2.0.0-rc6下载完后进入到
cd/usr/local/src/
ll
将yml文件放此处
官方文件上的介绍比较简单,本机上已经修改好了配置传入,在官方基础上添加了配置nodeport,使用宿主机去访问端口30002。这在官网上没有。官网上是service,没有该服务,那么我们就没有办法访问。
此处只能从本地进行访问,除非添加别的策略,所以我们先用最简单的方式从外网进行访问。这样就可以让公网从此处访问yml。除此外,还修改了镜像地址,如果官方镜像下载不下来,我们就可以使用本地镜像,服务是跑不起来的,我们最好使用国内的地址。或者将dashboard看作公司的一个服务,我们不能每次都从外网上去下载,所以我们需要通过更快的方式去下载该镜像。我们需要使用到harbor。我们在harbor上面创建一个项目,然后把镜像传上去,因为刚才已
经下载完成,所以我们就先访问一下harbor,输入网址
harbor.magedu.com,然后登录网站,创建好项目baseimages,设置成公开项目。
然后在当前节点上把镜像传上去,然后进行配置,输入
dockerimages
dockertagcdc71b5a8a0e
harbor.magedu.com/baseimages/v2.0.0-rc6
这样我们的镜像下载就比较快了,可以再来查看下版本,输入
dockerimages
发现版本就是v2.0.0-rc6,再来输入
dockertagcdc71b5a8a0e
harbor.magedu.com/baseimages/dashboard:v2.0.0-rc6
改完后传上去,但是现在还不能上传,先来写host文件,输入
dockerpush
harbor.magedu.com/baseimages/dashboard:v2.0.0-rc6
vim/etc/hosts
在hosts文件中将地址指向172.31
在172.31.3.101.master1中输入172.31.3.106magedu.com,写完
hosts后进行登录,输入
dockerd--help|grepins
然后修改service文件,输入
vim/lib/systemd/system/docker.service
找到service后在execStart后添加--insecure-registry
harbor.magedu.com,然后就可以进行重启
那么我们怎么能让宿主机在节点自动拦截镜像呢?稍后进行配置。改完之后先将docker进行重启,输入
systemctldaemon-reload
systemctlrestartdocker
重启让配置进行生效,只有node节点会经常上传下载镜像,所以只需要配置node节点,master节点不需要进行配置,所以只有node
节点需要添加该参数及解析,输入
vim/lib/systemd/system/docker.service
找到service后如上添加--insecure-registry
harbor.magedu.com
添加完后输入systemctldaemon-reload
systemctlrestartdocker
再输入dockerpullalpine
vim/lib/systemd/system/docker.service
进入后进行配置然后重启
systemctldaemon-reload
systemctlrestartdocker
因为我们不知道容器会创建在哪个节点上,所以我们需要将三个节点都进行配置。
重启后在管理端master上进行登录,输入
dockerloginharbor.magedu.com
不能登录发现域名出现问题,改为harbor.linux39.com,将上述的域名都改为harbor.linux39.com,改完域名后进行重启。将所有域名都修改,输入
dockertagcdc71b5a8a0e
harbor.linux39.com/baseimages/bashboard:v2.0.0-rc6
登陆成功后输入
Dockerpushharbor.linux.com/baseimages/dashboard:v2.0.0-rc6
传上去后就可以将dashboard跑起来,现在跑不起来是因为宿主机像需要在外网上下载,如果宿主机下载不了镜像,那么该服务就不能跑起来。
所以我们还是需要从内部下载,输入
vim/lib/systemd/system/docker.service
修改配置中的insecure-registryharbor.magedu.com为
insecure-registryharbor.linux39.com,修改完后将docker重启,
每个节点的配置中的service都需要进行修改。修改完后输入
Systemctldaemoon-reload&&systemctlrestartdocker进行重启,三个节点都修改完后就可以让dashboard跑起来。那么如何跑呢?首先我的像已经上传了
然后复制该镜像的地址,然后尝试看是否能够在node节点上将镜像拉取下来,输入
Vim/etc/hostname
Vim/etc/hosts
进入后添加配置172.31.3.106harbor.linux39.com
加上一个地址的解析,加上后再来尝试是否可以拉取镜像,需要先手
动测试通过,输入dockerpull
harbor.linux39.com/baseimages/dashboard:v2.0.0-rc6
成功后就可以自动拉取镜像。
将三个节点都配置上地址解析然后手动测试,完成后再来跑
dashboard,在master中输入
vimdashboard-2.0.0-rc6.yml
再跑之前将镜像地址修改不去官网上下载,而是内网地址,修改地址
将image修改完后,就可以进行创建。还用到一个镜像也进行修改,复制该地址另外一个窗口进行pull,输入dockerpullkubernetesui/metrics-scraper:v1..0.3
下载完成后使用tag将地址进行修改,输入
Dockertagdocker.io/kubernetesui/metrics-scraper:v1.0.3
harbor.linux39.com/baseimages/metrics-scraper:v1.0.3
改完后进行pull,输入
dockerpull
harbor.linux39.com/baseimages/metrics-scraper:v1.0.3
然后将yml文件中也进行修改,修改为
harbor.linux39.com/baseimages/metrics-scraper:v1.0.3
让node节点到我们自己的节点上下载镜像
此外还添加了一个yml,admin-user.yml,用来进行权限控制,再来
输入
Kubectlapply-fdashboard-2.0.0-rc6.yml
Kubectlapply-fadmin-user.yml
创建完两个文件后输入
Kubectlgetpod
Kubectlgetpod-A
可以看到由于内部下载,镜像下载非常快,pod访问也快
再使用kubectlgetservice进行访问
输入kubetclgetservice-A
结果显示端口中有30002,此时我们就可以进行访问,在官网上输入
172.31.6.108:30002
107、108、109节点都可以,因为node比较特殊,一旦定义了port在任何一个节点上都会进行监听,那么30002意味着当前我们是三个节点,那么三个node节点都监听,可以进行验证,比如在107上输入
ss-tnl
结果如下
可以看到结果中存在30002,按照此方法验证108和109
访问结果
存在服务协议问题,输入网址https://172.31.3.108再进行回车就
可以进行访问了。
此时又存在问题需要使用临时的token进行登陆,那么怎么获取登录token呢?
在管理端输入
kubectlgetsecret-Algrepadmin-user.
kubernetes-dashboard
admin-user-token-6kwbrkubernetes.io/service-account-token3
3m15s
kubectldescribesecretadmin-user-token-6kwbr-n
kubernetes-dashboard
这样就可以拿到token
将token复制后输入到刚才网页上发现可以登录这样就可以使用dashboard了,以上就先将dashboard跑起来。左侧菜单可以切换namespaces,namesoacs是集合项目的,我们会将每个项目的namespaces跑在每个项目中,所以想要查看哪个项目的namespaces就可以进行切换,默认是default。如果想要到pod中去
查看有哪些东西,就可以选择其中的pod然后进入到pod中去进行操作。
所以master或者pod权限非常多,我们要注意不能泄露。