开发者学堂课程【Kubernetes 入门实战演练2020版:Kubeadm 初始化高可用 kubernetes v1.17.2集群】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/656/detail/10860
Kubeadm 初始化高可用 kubernetes v1.17.2集群
内容介绍:
一、Kubeadm
二、初始化设置
一、Kubeadm
Kubeam 如何基础化集群,文档可以查看官方文档。Kubeadm参数有很多,其中主要的一些都添加了注释,所以除了可以查看官方文档外,还可以查看老师写的文档,其中都添加了注释。
1.Kubeadm
是一个工具,它提供了Kubeam init 以及 Kubeam join这两个命令,Kubeam init 是一个初始化的集群,join是将一个mast节点护着nobe节点加入到Kubermnetes中去,作为快速创建kubernetes集群的最佳实践。
ubeadm 通过执行必要的操作来后动和运行一个最小可用的集群。其中必要的操作有很多,包括各种镜像,各种证书和内部的集群。
它被故意设计为只关心启动集群,而不是准备节点环境的工作,也就是参数的初始化以及调优和各种命令,都得自己进行。
同样的,诸如安装各种各样的可有可无的插件,例如Kubermnetes 控制面板、监控解决方案以及特定云提供商的插件,尤其是国外的几个特定云与kbs的兼容性相对比较好,会有特殊的接口协议,比如存储的时候,一些接口可以直接到kbs上,让kbs可以被调用;但是国内一些软件的支持就不太好,阿里的支持性也不太好。可以自己选择版本,包括1.16,1.17等。这些都不在它负责的范围。
相反,我们期望由一个基于kubeadm 从更高层设计的更加合适的工具来做这些事情;并且,理想情况下,使用kubeadm作为所有部署的基础将会使得创建一个符合期望的集群变得容易。
2、使用帮助:
kubeadm init启动一个 Kubernetes主节点
kubeadm join启动一个 Kubernetes工作节点并且将其加入到集群kubeadm upgrade更新一个Kubernetes集群到新版本
kubeadm conig 如果你使用kubeadm v1.7.x或者更低版本,你需要对你的集群做一些配置以便使用kubeadm upgrade命令
kubeadm token使用kubeadm join来管理令牌
kubeadm reset还原之前使用kubeadm init 或者kubeadm join对节点产生的改变
kubeadm version打印出 kubeadm 版本
kubeadm alpha预览一组可用的新功能以便从社区搜集反馈
主要查看kubeadm init。点击进入,进入之后右上角可以选语言,选择中文。
kubeadm init
此命令初始化一个 Kubernetes 控制平面节点,也就是控制端。
概要:运行此命令来搭建Kubernetes控制平面节点。*init”命令执行以下阶段:
root@kubeadm-master1:~# kubeadm init –help 查看参数2.-apiserver-adwertise-address string
API服务器所公布的其正在监听的IP地址。如果未没置。则使用默认网络接口.
--apiserver-adivertise-address string
--apiserver-bind-port int32 接听端口有很多类型,有字符串类型也有数字类型。有这样要求的原因在于,后期调用的时候,有的是用API调用的。API调用的时候就需要传递相应的数据类型,如果要求的调用的是字符串,而错误传递数字就有可能调用不成功。这是API的要求,假如是初始化则无所谓。
②--apiserverbindport int32 Port for the API Server to bind to. (default 6443)
--apiserver-cert-extra-sans strings Optional extra Subject Alternative Names (SAVs) to use for the API Server serving certificate. can be both IP addresses and DNS
#可选的证书额外信息,用于指定API server的服务器证书。也可以是IP地址也可以是dns名称。是可选的,凡是跟证书有关的配置,都不需要配置,因为它会自动初始化,在老师文档中字体颜色为紫色的是需要指定的。
黑色的都不要指定的,红色的是在左kds调节时使用。假如kds需要装一个负载均衡的节点,需要基于这个节点来使用。
③--cert-dir string#证书的存储路径,缺省路径为/etc/kubernetes/pki
④--certificate-key string#定义一个用于加密kubeadm-certs secret中的控制平台证书的密钥.③和④都不需要定义。
4.--config string #kubeadm #配置文件的路径 保持默认。
二、初始化设置
1、Config 文件的位置
当前用户的加目录会生成一个config文件,这个config文件是后期加命令连接apiserve的重要凭据。
其他配置文件。例如会通过一些容器来启用一些控制端容器,这些容器也有配置文件,就保持默认就可以。
-config string path to kubeadm configuration file
2、-control-plane -endpoint string#为控制平台指定一个稳定的IP地址或DNS名称,即配置一个可以长期使用切是高可用的VIP或者域名,k8s 多 master高可用基于此参数实现.
Specify a stable IP address or DNS name for the control plane这个控制平台可以认为是api的控制加端口。就是访问kbs的时候需要通过ip加地址的方式。
虽然可以用域名进行解析,但最后都会被解析成一个ip地址。你
通过那个地址跟哪个端口来访问kds客户端。
apiserver-adwertise-address string是客户端的监听地址。监听地址是本机的,需要写成本机的或者0-0-0来监听本地的所有地址,假如更换服务器3.103,就需要更写3.103. 但是—control -plane-endpoint string 这个地址是不需要更改的,作用是稳定地址或者控制域名给你的控制平台。但这个域名就是hperson 和keplove所监听的地址。
如下图所示,配置一个稳定的地址:172.31.3.102,这个地址就是稳定的地址不会更改,不像服务器的地址,而且服务器还存在多个,所以如何对kpr的多个服务器进行统一的调度和访问呢。解决办法就是通过wep对他们进行负载平衡。
所以最终访问的时候访问的是终止平台端口的6443,当然这个过程是由kepha-l来保证高可用,kep来保证端口的可用性。
会让请求这些ha-l的地址往mater上分发。以tcp的方式。如何进行配置。
kubeadm init -- api serve r adve rtise- address-172.31.3.101 --apiserver bind- port=6443 -- control-plane endpoint=172.31.3.248 所以会用3.248作为kube master对外的一个入口。
3、- cri-socket string #要连接的CRI(容特运行时接口,Container Runtime Interface, 简称CRI)套接字的路径,如果为空,则kubeadm将尝试自动检测此值,"仅当安装了多个CRI或具有非标准CRI插槽时,才使用此选项"。这个也不用配置,因为最后也会保持默认。
4、-dry-run #不要应用任何更改,只是输出将要执行的操作,其实就是测试运行。Don’t apply any changes;just output what would be done
5、- experimental kustomie string #用于存储kustomize为静态pod清单所提供的补丁的路径。不需要配置。
6、-feature gates string#-一组用来描述各种功能特性的键值(key=value) 对,比如说一些类似于arf功能,或者一些很特殊的功能。
选项是: IPv6DualStack=true|false (ALPHA - default=false)
7、ignore preflight errors strings #可以忽略检查过程中出现的错误信息,比如忽略swap, 如果为all 就忽略所有。在系统进行初始化的时候会对系统进行各种检查,包括内核参数,交换分区是否符合安装分发所要求,如果不符合要求就会报错,甚至会直接停止安装或者继续进行初始化。其实有些totle是可以忽略的,比如交换分区,就就想用交换分区,可以提供某些参数,把检查忽略掉。
例如:ignore-preflight-errors=swap这是只忽略其中一个选项,如果想忽略所有检查,“value all”ignores errors from all.交换分区可以用,但会降低性能,所以最好不要用。
忽略交换分区的检查报错。
ignore-preflight-errors=swap
8、--image-repositorystring 一定要写。客户端adm在初始化kidemaster时,会需要一些径向,这些径向就是所需要的三个服务的径向。径向默认到Choose a container registry to pull control plane images from (default "k8s.gcr . jo" )。但这个地方是谷歌的径向仓库,根本下不来。所以会将其指向国内的一些径向网站,比如阿里云等。
Registry.cn-hangzhou.aliyuncs.com/gogle_containers/coredns:1.6.5就是阿里云谷歌的径向仓库,会将谷歌的径向仓库下载到阿里云的径向仓库,之后就可以从阿里云上下载,这样再下载径向就不会报错。
9、-kubernetes- versionstring #指定安装k8s版本,默认为stable-1. Choose a specific Kubernetes version for the control plane. (default " stable-1")一般情况下都需要手动指定,假如想装1.17.2,
-kubernetes- versionstring=1.17.2
10、--node name string#指定node节点名称。这个一般不需要指认。Master节点或者novel节点加到kebmaster之后,使用kebmaster的某些命令,查看kebmaster中的novel节点,那么如何区分哪些是novel节点呢,可以通过主机名进行区分,可以在kebmater中保证主机名是唯一的。
11、-pod-network-cidr #设置pod ip地址范围,这个一定要设置,也就是设置给你的容器一个ip地址段,这个ip地址段可以自定义,前提是后期的网络插件,有些网络组件是可以指定ip地址段的,在网络插件中,地址跟这个一致。K8s里面有三个地址段,那么容器分哪个地址段呢,只需要跟当前网络不冲突就行。如果在多系统条件下,也得保证容器地址段跟任何一个网络都不冲突,否则后期在跨机房调用时,就会出现ip地址没法调用,因为出现重复,网络地址就没办法指用,在后期多机房的情况下,一定要划分清楚,避免出现重复。
-pod-network-cidr=10.10.0.0/165划分成了一个16的字符页面,IP字段是10.10.的。
12、-service- cidr #设置service网络地址范围。Service的地址段也需要进行指定。存在默认值,在这两个网络中,service的地址应用很少,一个业务有二三十个服务,就算一个服务占用一个service地址,也有很多地址。Pod则不同,所以这个网段消耗比较大
-service- cidr=192.168,这样好区分。
13、-service -dns -domain string #设置k8s内部域名,默认为cluster.local, 会有相应的DNS服务(kube- dns/coredns)解析生成的域名记录。这些值也都需要设置,一般会修改后缀,例如可以改成-service -dns -domain=Linux39.local 这个local只是一个序列,也可也改成nate等。后期会创建Linux39.local,创建的service会由kbds等来解析成记录。
14、--skip-certificate-key-print#不打印用于加密的
key 信息--skip-phases strings #要跳过哪些阶段,
--skip-token-print#跳过打印
跳过一些检查。一般需要进行打印,因为不打印不知道towken是什么信息,跳过的话就无法将note节点和master节点加入进来,这个过程是需要使用token的,所以不需要跳过,需要打印出来。
15、--token string The token to use for establishing bidirectional trust between nodes and control-plane nodes. The format is [a-z0-9](6).[0-20- ]{16j - e.g. abcdef.0123456789abcdef 可以给客户adm传递一个参数,给参数设置一个固定的token,这个值给了一个固定的格式,格式就是[a-z0-9](6).[0-20- ]{16j - e.g. abcdef.0123456789abcdef不需要更改,默认会给一个初始化的token。
16、--token-ttl duration The duration before the token is automatically deleted (e.g.1s, 2m,3h). If set to '0 ', the token will never expire (default 4h0m0s) 意思是 无论用户设置的token还是系统默认的token都会有一个默认的生命周期,生命周期默认值是24小时,一天之后就会过期。
如果想将token的默认周期设置更长,可以进行更改。可以设置多少小时,多少分,多少秒;假如想设置三天,则可以更改成72小时。但是token值不要设置太长,因为万一流传出去,别人就会使用token值来管理kbs,所以一般不需要更改,保持默认就可以。
17、--upload-certs Upload control-plane certificates to the kubeadm-certs Secret. 作用是更新ksb证书,不需要更改,证书它会自动进行更新。
18、#全局可选项:
-add-dir-header #如果为true,在日志头部添加日志目录。不需要添加,添加了之后会在头部添加一个日志目录。
--log-file string #如果不为空,将使用此日志文件·不需要添加,一般更新在系统日志里。
--log-file-max-size uint #设置日志文件的最大大小,单位为兆,默认为1800兆,0为没有限制
--rootfs #宿主机的根路径,也就是绝对路径。不需要设置
--skip-headers#如果为 true,在log日志里面不显示标题前缀不需要设置,将日志打印成标准日志就可以
--skip-log-headers#如果为 true,在 log日志里里不显示标题。不需要设置,将日志打印成标准日志就可以。
所以最终进行初始化所写的选项就是以下内容,这些内容就足够进行初始化了。
kiteadm init --apiserver-aivertise-address=172.31.3.101 --apiserver-bind-port=6443 --control-plane-endbointal172.31.3.248--ignore-preflight-errors=Swap --image-repository=registry .on-hangzhou.aliyuncs .com/google containers/-kubernetes-version=v1.17.2 --pod-network-cidr=10.10.0.0/16--service-cidr=192.168.1.0/20--service-dns-domain=linux39.local
2、镜像的准备
2.1了解下载什么镜像
root@kubeadm-master1:~#kubeadmversion
kibeadm version: bversion. nfo(rajor '"1 , kinor "17',, itersion."v1.7.2 , 6itcamnt 583ce5o3c87158e510657的9f242K64df89',6itieste;'clea ', Bbildnate:'2021-01-18T23:27:49z",GoVersion: "go1.13.5,Compiler: "gc""Platform: "linux/amd64"}
root@kubeadm-master1:~#.
本机系统版本是v1.17.2,所以需要下载17.2的镜像。此镜像需要去谷歌的镜像仓库去下载。
#查看安装指定版本k8s需要的镜像有哪些,
# kubeadm config images list --kubernetes-version v1.17.3-
k8s.gcr.io/kube-apiserver:v1.17.3
k8s.gcr.io/kube-controller-manager:v1.17.3
-k8s.gcr.io/kube-scheduler:v1.17.3
k8s.gcr.io/kube-proxy:v1.17.3
k8s.gcr.io/pause:3.1-
k8s.gcr.io/etcd:3.4.3-O
k8s.gcr.io/coredns:1.6.5
# kubeadm config images list --kubernetes-version v1.17.3-
会将用户所设置的镜像打印下来,就得到了一个镜像的列表。
k8s.gcr.io/ kube-apiserver:v1.17.2
k8s.gcr.io/ kube-controller-manager: v1.17.2
k8s.gcr.io/ kube-scheduler: v1.17.2
k8s.gcr.io/ kube-proxy : v1.17.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0k8s.gcr.io/coredns :
1.6.5root@kubeadm-master1:~#
会告诉用户所需要的镜像是多少,apiserver所用到的镜像是1.17.2;controller-manager所用到的镜像是1.17.2,scheduler所用到的镜像是1.17.2。
Pause意思是在一个Pause中封装一个网络接口,就是基于Pause这个镜像进行封装的。给每一个point封装一个底层的网络,目前所使用的版本是3.1,而且版本更新很慢。让这个point中多个容器公用一个基层的网络信息,网络是公用的,但系统是隔离的。
镜像下载,已经知道了镜像和阿里云镜像地址,镜像可以直接进行安装,下载的时候可以直接进行初始化。也可以手动将镜像先下载下来,这样在初始化时所用的时间就会比较短。
registry.cn-hangzhou.aliyuncs.com/google_containers/
k8s.gcr.io/ kube-apiserver:v1.17.2
k8s.gcr.io/ kube-controller-manager:v1.17.272
k8s.gcr.io/ kube-scheduler:v1.17.2
k8s.gcr.io/pause:3.1
K8s.gcr.io/etcd: 3.4.3-o
K8s.gcr.io/coredns:1.6.5
然后将域名更换成阿里云的域名,
docker pull registry.cn-hangzhou.aliyuncs. com/google_containers/kube-apiserver:v1.17.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker pull registry.cn- hangzhou.aliyuncs.com/google_containers//etcd:3.4.3-O
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.575
为了节省时间,直接下载下来,因为初始化有时间限制,一旦超时就下载失败了。
复制下载命令的镜像:
rooti@kubeadm-master1:m# docker pull registry.cn-
hangzhou .aliyuncs.com/google_containers/kube-apiserver:v1.17.2registry.cn-hangzhou.aliyuncs.com/google_containers//etcd:3.4.3-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5v1.17.2: Pulling from google_containers/kube-apiserver
597de8ba0c30: Downloading [>]213kB/21.09MB
46657ede464b: Pulling fs layer让去阿里云下载就可以。最终会得到五个镜像,下载完进行验证,发现少了contreller manage 的镜像,是因为少复制了。但是没关系,因为可以自动进行下载。然后将其复制过来也进行下载。
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/contreller manage:1.7.2下载完成之后就可以进行初始化了。
70docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-071
然后将etcd也复制进去,就可以进行初始化了。
初始化有两种方式,一种是Kubeadm传参的方式,另一种是配置文件,可以生成一个config文件来进行初始化。这些服务,只需要提供参数就可以,然后他会自动生成文件,传递参数。
See 'snap info ' for additional versions.
root@kubeadm-master1:~#dco im^c
root@kubeadm-master1:~#docker imagesREPOSITORY
查看镜像是否正确
root@kubeadm-master1:~# kubeadm config images list --kubernetes-version v1.17.2
w 327 14:34:07.14126527949 validation.go:28]Cannot validate kube-proxy config · no validator is availableW0327 14:34:07.14131127949 validation.go:28]Cannot validate kubelet config -no validator is availablek8s.gcr.io/ kube-apiserver: v1.17.2
k8s.gcr.io/ kube-controller-manager: v1.17.2
k8s.gcr.io/ kube-scheduler: v1.17.2
k8s.gcr.io/ kube-proxy : v1.17.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0k8s.gcr.io/coredns :
1.6.5root@kubeadm-master1:~#
少了一个镜像k8s.gcr.io/ kube-proxy : v1.17.2
这两种方式都可以,假如想安装的话可以反反复复多次安装,可以先安装,然后进行多次尝试。
root@kubeadm-master1:~# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy.v1.17.2v1.17.2: Pulling from google_containers/ kube-proxy
Digest: sha256:4a1b15c88bcfb832de4d3b8e7f59c8249007554174e3e345897bcad4e7537faf
Status: Image is up to date for registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.2registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.i7.2
root@kubeadm-master1:~#docker images
REPOSITORY
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy TAG IMAGE ID CREATED SIZE
registry.cn-hangzhou.aliyuncs.com/aooale containers/kube-prixy
registry.cn-hangzhou.aliyuncs.com/google_containers/kupe-ap1server
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd
registry.cn-hangzhou.aliyuncs.com/google_containers/pause
root@kubeadm-master1:~#
root@kubeadm-master1:~# kubeadm config images list --kubernetes-version v1.17.2
W0327 14:35:36.74930628300 validation.go:28] Cannot validate kube-proxy config - no validator is availableM0327 14:35:36.74933928300 validation.go:28] Cannot validate kubelet config -no validator is available
k8s.gcr.io/ kube-apiserver: v1.17.2
k8s.gcr.io/ kube-controller-manager: v1.17.2
k8s.gcr.io/ kube-scheduler: v1.17.2
k8s.gcr.io/ kube-proxy: v1.17.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.30
k8s.gcr.io/coredns:1.6.5
root@kubeadm-master1 :~#.
少了一个kube,应该是复制的时候不小心删除了将它下载下来。
docker pull registry.cn-hangzhou.aliyuncs .com/google_containers/kube-controller-manager:v1.17.2
复制schedular
root(kubeadm-master1: # docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.2 此时7个镜像就足够了,有两种方式可以进行安装。
3、初始化的两种方式
第一种方式:
单节点master初始化:
# kubeadm init--apiserver-advertise-address=192.168.7.101 --apiserver-bind-port=6443kubernetes-version=v1.17.3 --pod-network-cidr=10.10.0.0/16 --service-cidr=10.20.0.0/16--service-dns-domain=linux36.local --image-repository=registry.cn-
hangzhou.aliyuncs.com/google_containers --ignore-preflight-errors=swap
下载完kubeadm,使用kubeadm的方式传递参数
第二种方式,
使用kubdeam生成初始化文件,然后再对问文件进行修改,
基于文件初始化高可用master方式: .# kubeadm config print init-defaults #输出默认初始化配置, # kubeadm config print init-defaults > kubeadm-init.ml #将默认配置输出至文件.# cat kubeadm-init.yaml#修改后的初始化文件内容.这种方式包括接口,token,controllerplaneendpoint 等,镜像地址,版本,域名,ds后缀等等。
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:-
- groups:-
- system:bootstrappers:kubeadm:default-node-token
-token: abcdef.0123456789abcdef.
ttl: 24h0mos-
- signing
- authentication
-kind: InitConfiguration
-localAPIEndpoint:-
advertiseAddress: 172.31.3.101.
nodeRegistration:-
criSocket:/var/run/dockershim.sock
name: k8s-master1.magedu.net
taints:-
- effect: NoSchedule.
key: node-role.kubernetes.io/master-
apiServer:-
timeoutForControlPlane: 4mOs
apiversion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
-clusterName:Kubernetes
controlPlaneEndpoint: 172.31.7.248:6443#添加基于VIP的 Endpoint
controllerManager:
dns:
type: CoreDNS.
etcd:
local:-
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration-
kubernetesVersion: v1.17.3
networking:
dnsDomain: magedu.local
podSubnet: 10.10.0.0/16.
serviceSubnet: 172.26.0.0/16s
cheduler:{}
单节点地址就直接指定初始化,多节点稍微复杂点。高可用则需要指定master方式。
高可用master初始化:
首先基于keepalived实现高可用vIP,然后实现三台 k8s master基于VIP实现高可用。·
基于命令初始化高可用master 方式:
#kubeadm init --apiserver-advertise-address=172.31.3.101 --control-plane-
endpoint=172.31.7.248 --apiserver-bind-port=6443 --kubernetes-version=v1.17.3 --pod-
image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --ignore-preflight-
errors=swap
通过命令进行初始化:
直接进行初始化,假如·有·命令·可以反反复复进行初始化,没有镜像也没关系,系统会自动提供。这个过程可能需要一段时间,需要稍微等待一下。
root@kubeadm-master1:~#docker images^c
rotitsto pn-masterl -4 itbah init ..apisever-adertis-tbres=172.313.121 .apiserv r-bind-part-5f43 .-control-plane-endpoint=172.31.3.248 ..ignore-preflight-errors5%的imnage-rpsitorjeregistry can-hanghou.atiyunc .cao goole cantainers/ ..hivemetes-version=v1.1.2 .pod-nebori-cidra10.1.0.616 .service-cide192.16.1./20 ..ervice-dns-domain=linux39.local.
能否初始化成功的关键第一点在于wip请求一定要将命令转发到172.31.3.103.6443所以可以查看103.6443在端口附近是否监听,
rootakubeadm-master1:~# ss -tnl
查看结果没看到6443,再等待一会,此时可以查看日志,观察有没有报错。
root@kubeadm-master1:~# tail -f /var/log/syslog
[kubele start] Initial timeout of 40s passed.等到时间都过了还没反应一定是哪里参数写的有问题,查看没有问题后继续等到。很明显是ipd地址还没有通,继续等待初始化,如果初始化能够通过的话会是如下一个结果。
[addens] Appliod essential addonE kube 。proxy
Your Kube rmetes control-plane has initialized successfully!
之后需要进行以下这些操作。To start using your cluster, you need to run the following a5 a reqular user:
sudo cp 1 /etc/ kube metes/ admin . conf $HOME/ . kube/config
sudo cp 1 /etc/ kube metes/ admin . conf $HOME/ . kube/config
sudo choun s(1d -u):$(1d .9) SHOME/ . kube/config
You should now deploy a pod network to the eluster.
Run "kubect apply t [podnetwork],yomt: with one of the options Listed at: ,使用root权限添加master节
https ://kube rnetes .10/ doc s/ one opts/c Luster administ rat ion/ addons/
You can now join any number of control-plane nodes by copying certificate Buthorities
and servlce account keys on each node and then running the following 05 root :
kubeadn join 172 .31.7.248:6443 token Ofpghu。wt0t8adybh86jzvk
..discovery- token Ca-cert hash sha256: oe2c43db9929b06c09465o4614112676f8c afb8009c8071f2ee14ledfc787 1
. control. Plane
Then you can join any nunber of worker nodes by running the following on each 05 root:
kubeadn join 172 31.7248:6443..token Ofpghu . rt0tBadybh86j zvk
--discovery- token ca-cert hash sha256: ase2c 43db9929b06c094e6564614112676f8c afb80809c8071f2ee141edfc787
rootekubeadn-moster1-
运行结果:
Unfortunately, an error has occurred:
timed out waiting for the C ondition
This error is Likely caused by:
The kubelet is not running
运行kubelet
root@kubeadm-master1:-# systemctl satus kubelet
Unknown operation satus
kubelet. service,i kubelet: The Kubernetes Node Agent
root@kubeadm master1:~# systemctl status kubelet
打开会继续进行初始化,可能会报错,并不影响。root@kubeadm- masterl:~# kubeadm init - - apise rver . adve rtise . address=172.31.3.101.. apise rve r-bind-port=6443 -control-plane- endpoint=172.31.3.248 ..ignore-preflight-errors
=Swap .- image- reposi to ry= regist ry. cn -hangzhou. al iyuncs .com/ google_ containers/ .- kube rnetes-ve rsion=v1.17.2 --pod- network-cidr-10.10.0.0/16 --service-cidr=192.168.1. 0/20
ervice dns - domain=linux39. Local
因为之前的初始化已经有数据了
root@kubeadm- masterl:-# kubeadm reset
[reset] Are you sure you want to proceed? [y/N]: y
删掉数据再重新初始化,保证kubernetes数据启动时再进行初始化。root@kubeadm- masterl:~# kubeadm init - - apise rver . adve rtise . address=172.31.3.101.. apise rve r-bind-port=6443 -control-plane- endpoint=172.31.3.248 ..ignore-preflight-errors
=Swap .- image- reposi to ry= regist ry. cn -hangzhou. al iyuncs .com/ google_ containers/ .- kube rnetes-ve rsion=v1.17.2 --pod- network-cidr-10.10.0.0/16 --service-cidr=192.168.1. 0/20
ervice dns - domain=linux39. Local
重新查看日志:
root@kubeadm- masterl:~# -f /var/log/syslog
等待过后还是报错,可能是参数有问题。重新reset
root@kubeadm- masterl:-# kubeadm reset
[reset] Are you sure you want to proceed? [y/N]: y
root@kubeadm- masterl:~#
#kubeadm init - apiserver advertise address=172.31.3.101 - control plane-
endpoint=172.31.7.248 --apiserver -bind-port=6443 - kubernetes version=v1.17.3 - pod-
network- cidr= 10.10.0.0/16 --service cidr=172.26.0.0/16 --service dns domain=magedu.local -
image repositregistry.cn-hanghou.aliyuncs.com/google. containers -ignore preflight-
errors=swap
在这个命令里,只有一些地址段与之前不一样,使用这个参数进行初始化。为1.17.3,会下载镜像,等到加载。
root@kubeadm- masterl:-# kubeadm reset
[reset] Are you sure you want to proceed? [y/N]: y
root@kubeadm- masterl:-#kubeadm init - . apiserver- advertise - address=172.31.3.101 - cont rol-plane endpoint= 172.31.3.248..apiserver bind-port=6443 - kubernetes-version=v1
.17.2
pod-network-cidr-10.10.0.0/16 -service-cidr-172.26.0.0/16 --service dns domain=magedu. Local -image repository= regist ry . cn-hangzhou .aliyuncs . com/ google containers
-- ignore preflight errors= swap
在这个服务器上有些端口已经被使用,所以重启服务器,
rootigkubeadm- master1:-#
root@kubeadm- master1:~# reboot
或者换个节点,在别的节点初始化有可以。当在任何一个其他节点初始化之后,再将这个节点加入进来。
root@kubeadm-master1:-# ss tnL^C
root@kubeadm- masterl:-# kubeadm init - apiserve r- adve rtise- address=172.31.3.101 .-Control- P Lane- endpoint=172.31.3 .248.apise rve r-bind-port=6443 - . kubernetes-version=v1
.17.3 - pod-network-cidr=10. 10.0.0/16 --service -cidr=172.26.0.0/16 --service- dns . domain=magedu .local - image . repository=registry. cn hangzhou. aliyuncs .com/ google containers
ignore-preflight- errors=swap 如果环境没有问题,一般不会报错。
端口已经被占用。
root@kubeadm- masterl:~# kubectl
reset
root@kubeadm asterl:~# kubeadm
reset节点好像有问题,重新更改节点再进行。
rootakubeadm-master2:-# kubeadm init
.. apiserver advertise . address=172.31.3.102.-control-plane . endpoint=172.31.3.248 apiserver-bind-port=6443 -. kubernetes-version=v1
.17.2 --pod-network-cidr=10.10.0.0/16 .. service-cidr=172.26.0.0/16 . service- dns domain=magedu . local . image- repository=registry. cn-hangzhou . aliyuncs.com/google containers ignore-preflight- errors=swap发现有些服务已经在运行,先将这些服务停止。
root@kubeadm- masterl:~# systemctl stop kube apiserve r kube cont roller
. manager kube- scheduler
Fatled to stop Kube-seheduter Ssernage UArY cieschedue setrice not nogereaservzce not Loaded;
root@kubeadm- master1:-#1
镜像下载完成之后又到了
[wait . control-plane] Waiting for the kubelet to boot up the control pLane as static Pods from directory "/etc/ kube rnetes/manifests". This can take up to 4mOs
发现6443端口已经运行,此时应该就可以转换过去了,需要保持haproxy能将其转化过去。
root@hal:~# vim /etc/haproxy/haproxy. Cfg
root@hal:-# systemctl restart haproxy
root@hal:-#
Your Kubernetes control-plane has initialized successfully!
初始化成功,可能是环境有问题,但是102是可以初始化成功的。能够通过负载均衡再将这个值转化为自己,将自己初始化成为一个master。102节点起来后,会提供一些选项。
[bootstrap-token] Creating the "cluster- info" ConfigMap in the ”kube public ”namespace
[kubelet-finalize] Updating " /etc/kube rnetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube -proxy
Your Kubernetes control-plane has initialized successfully!
start using your cluster, you need to run the following as a regular user:
这些运行需要一些权限,需要当前用户的权限,需要当前用户创建一个cube加目录,
mkdir P $HOME/ . kube
然后拷贝这个文件:sudo cp -i /etc/ kube rnetes/ admin . conf $HOME/ .拷到 kube/ config加目录里面。
修改权限sudo chown $(id -u):$(id g) $H0ME/ . kube/config
就可以执行kubectl 命令。
root@kubeadm- master2:#kubectl get nodes,是查看,
当前执行不了,所以以上操作是第一个操作,到服务器上获取这些资源信息。
第二个是安装一个网络插件:
You should now deploy a pod network to the cluster .
Run "kubectl apply -f [podnetwork].yaml" with one of the options Listed at:
可以到https://kube rnetes. io/ docs/ concepts/c Luster- administ rat ion/ addons/中查看用户所要安装的组件,
第三个是可以使用以下方式假如一个control plane nodes。其实就是加入master。
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join 172.31.3.248:6443 - token fntc3t. ya020llpadlxdeh1 \
--discovery- token-ca-cert hash sha256:b458498a54211d2dfc2e1994a8701213b75787d311ebbe2d973941267470b6e1 \
--control-plane
最常用的是下面这个:Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 172. 31.3.248:6443.. token fntc3t. ya020llpadlxdeh1 \
--discovery- token-ca-cert hash sha256:b458498a54211d2dfc2e1994a8701213b75787d311ebbe2d973941267 470b6e1
以上这些token以及返回的数据要注意记录下来,因为后面会用到。
1.实际操作:
4.1、创建加目录:
root@kubeadm master2:~# vim /etc/kubernetes/admin.conf查看文件中的内容,源文件中记录了当前用户的正负信息,是由kubeadm生成的,然后指向了VIP:server:
http://172.31.3.248.6433。所以在后期都会通过这个端口转入到三台master中的任一一台。
认证信息,操作的时候会有端号:
Users:
-name:Kubernetes-admin
意味着是个超级管理员,认证的时候并不是使用账号密码,而是使用密钥。所以这个地方放置的就是账号信息。只要拿到这个信息,就意味着对你的kbs有官方权限,所以文件得好好保存,不要放置到note节点上,否则会在所有的节点上都能够被认证,进行一些增删改得操作。
显示Kubeadm master2.magedu.net NotReady master 3m54s v1.17.2这个是没有关系的,因为还没有安装网络组件,在没有安装网络组件之前,显示都是这样的。
加入其他两个节点:
加入103:
在另外一台已经安装了docker、kubeadm 和kubelet的master节点上执行以下操作:。
# kubeadm join 172.31.7.248:6443 -token 0fpghu.wt0t8adybh86jzvk \
-discovery-token-ca-cert-hash
sha256:aae2c43db9929b06c094e65a4614112676f8cafb80809c8071f2ee141edfc787 \
--control-plane -certificate key
b66cd885cbd3b94cace2ddfad3037935ba3dabc63bf2aee0c28878b6857ac53b
certificate key 默认没有提供,所以需要在master中生成,在哪个节点上初始化就到哪个节点上去生成,相应得key文件。
rootakubeadm- master2:~# kubeadm init phase upload-certs -upload-certs
upload-certs] Using certificate key
af6095c5993a06089b5380d149bfc091de279210dab84937 e2c8f4d96 j99dc7b
复制af6095c5993a06089b5380d149bfc091de279210dab84937 e2c8f4d96 j99dc7b
kubeadm join 172.31.3.248:6443 --token fntc3t 。ya02011pad1xdeh1
--discovery-token-ca-cert -hash sha256:b458498a54211d2dfc2e1994a8701213b75787d311ebbe2d973941267470b6e1 \
二一control -plane
-certificate- key
f6095c5993a06089b5380d149bfc091de279210dab84937e2c8f4d96199dc7b
这个时候就可以将节点加入到kbs中去,并且是个master节点。然后点击回车,172.31.3也会拉入进去,所以等会master加入进去之后,master就会有两个,等待103也加入进去,今天的环境可能有点问题,所以加载比较慢。目前最好的做法先关闭不需要得服务器,不让它继续加载,只加载需要的服务器。不要向102和103中转化,因为102和103都没有启动。
[preflight] You can also perform this action in beforehand using ' kubeadm config images pull
先加入102跟103再解决101,这个节点有点麻烦,因为rest不掉。
root@kubeadm- masterl:-# kubeadm reset
[reset] Are you sure you want to proceed? [y/N]: y
完成后与可以在上面重新加入进去。在加载的过程中也是对你的etcd进行扩容的过程。有一个创建etcd的步骤。在其中会生成一个新的etcd member,这个etcd mwmber就是新的节点。它将已经新的节点加入到已经存在的cluster中,这个cluster就是102的单节点。所以会将101节点进行扩容,扩容之后创建一个pod给etcd,.然后将etcd加入进去,加入之后etcd就变成两个节点了。
rootakubeadm- master3:~# kubectl get node
The connection to the server Locathost:8080 was refused . did you specify the right host or port?
root@kubeadm- master3:-#
rootakubeadm- master3:~# kubectl get node
The connection to the server Locathost:8080 was refused . did you specify the right host or port?
回到102中查看:
[upload-certs] Using certificate key:
af6095c5993a06089b5380d149bfc091de29210dab84937e2c8f4d96199dc7b
root@kubeadm- master2:-# kubectl get nodes
NAME STATUS ROLES AGE VAISION
kubeadm- master2. magedu . net NotReady master 9m38s vl.17.2
kubeadm- maste r3. magedu net NotReady master 68s v1.17.2
使用这个命令将101也加入进去:
io/doc 101 kubeadm join 172.31.3.248:6443 --token fntc3t ,ya02011pad1xdeh1 \
-discove ry-token-ca-cert -hash
[prefl
sha256:b458498a5421 ld2dfc2e1994a8701213b75787d31 lebbe2d973941267470b6e1 \ control-plane --certificate-key
[prefl
af6095c5993a0608 9b5380d149bfc091de279210dab84937e2c8 f4d96199dc7b
[prefl 102
就变成三个节点了。也就是三个master。
在101中加的时候依然会对etcd进行扩容。扩容成功查看
root@kubeadm- master1:-# docker ps
发现11秒12秒之前扩容了很多容器。包括kds的管理端,有controller等。
root@kubeadm- master2:-# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubeadm- maste r1. magedu .net NotReady maste r 40s v1.17.2
kubeadm- maste r2. magedu .net
NotReady
maste r
11m
v1.17.2
kubeadm- maste r3. magedu .net
NotReady
maste r
t 2m33s
v1.17.2
观察到节点变成三个,发现并没有准备完成,所以这个时候需要装网络组件,组件怎么安装,需要查看返回值,刚才102创建完成之后,给了一个返回值
You should now deploy a pod network to the cluster .
Run kubectl apply -f [podnetwork.yaml" with one of the options listed at:
https: / /kube rnetes . io/docs concept s/ cluste r- administ rat ion/ addons/可选项只能组装一个,那可选项有多少个呢。
去查看ur
1Calico is a networking and network policy provider. Calico supports a fexible set of networking options so you can choose the most efcient option for your situation, including non-
ovehdy and overlay networks, with or without BGP Calico uses the same engine to enforce network policy for hosts, pods, and (if using Istio & Envoy) applications at the service mesh
layer.
2、Flannel is an overlay network provider that can be used with Kubernetes.
点击查看
kubect1 apply -f https ://ran. githubusercontent。com/coreos/flanne1/master/Documentat ion/k8s - nanifests/kube。 Flannel-legacy.yml
For Kubernetes v1.7+ kubectl apply -f https://ran. githubusercontent。com/coreos/ flanne1/naster/Docunentat ion/kube- flannel ym
See Kubenfetes for more details.和我们的不一样就算直接安装也不能用,因为地址段不同,我们的地址段指向了172.6,而它的地址段默认是10.244.0所以这个组网用不了,必须改成我们自己的组网地址。
root@kubeadm- master2:-# wget https :// raw . gi thubuse rcontent . com/ coreos/ flannel/ master/Documentation/ kube . flannel. Yml
root@kubeadm master2:~# vim kube- flannel. yml
root@kubeadm- master2:~# kubectl apply -f kube- flannel. Yml
root@kubeadm master2:-# kubectl get nodes
NAME
STATUS ROLES AGE VERSION
root@kubeadm master2:-# kubectl get nodes
root@kubeadm master2:-# kubectl get nodes
root@kubeadm master2:-# kubectl get nodes
查看node节点有没有变成read状态,因为在这个文本组件里面它也是创新的容器。
容器也有镜像,镜像地址是:
image: quay . io/coreos/flannel:v0.12 0- amd64是官方的镜像发布。
有一个ok就意味着它将镜像下载下来了。如果实在下载不下来就找一个节点或者从外围网导入进来。导入进来传到自己的kube中去。再将镜像地址改成本机的,其实就是将image后的地址改成自己的hobe地址,改完之后就可以从内网下载镜像。这个时候从内网下载的时间就很快。
root@kubeadm master2:~# vim kube- flannel. Yml
root@kubeadm- master2:~#
root@kubeadm master2:-# docker images
rootdkubeadm- master2:~# kubectl get node s
镜像一旦下载起来,网络组件就会检查成功,master就会变为ready,继而组装完成。Master组装完成之后就是添加nobe,就会比较简单。
初始化完成之后master,将kubeadm 命令指定一下。
Then you can join any number of worker nodes by running the following on each as root :添加工作节点node节点,每个节点使用root添加。
kubeadm join 172.31.3.248:6443 --token fntc3t .ya02011pad1xdeh1 \
-di scovery- token-ca-cert -hash sha256 :b458498a54211d2dfc2e1 994a8701213b75787d31 lebbe2d973941267470b6e1
然后执行107,这个节点就会添加进去。而且速度很快。
rootigkubeadm- masterz:-t KuDectL get nodes
HAME
STATUS
ROLES
AGE
VERSION .
kubeadm- masterl . magedu. net
Ready
maste r
5m3s
v1.17.2
kubeadm- maste r2. magedu .net
Ready
master
15m
v1.17.2
kubeadm- master3. magedu . net
Ready
master
6m56s
v1.17.2
node节点只需要执行一下join命令,master会自动下发一些指令。这些指令就是让它去创建fflown,如果没有的话就是镜像下不来,可以等待一会,等到ok。
两条初始化命令:
kubeadm init -- api se rve r - adve rt ise- address=172.31.3.101 --apise rve r -bind port=6443 -- control -plane endpoint-172.31.3.248
- ignore -pre f1 ight -er rors= swap -- image - repos i tory= reg ist ry . cn-hang zhou . a liyuncs . com/google containers/
WO327 I
- kube rnetes-version-v1.17.2 --pod- network-cidr= 10.10.0.0/16 --service-cidr-192.168.1.0/20
| W0327
se rvice -dns -doma in=linux39. local
[init] 67
kubeadm init
- api se rver - advertise address-172 .31.3.102 -- control -plane endpoint=172.31.3.248
[prefl
- api server-bind port 6443 -- kubernetes -version-v1.17.2 - pod- network-cidr- 10.10.0.0/16 --service-cidr-172 .26.0.0/16
--service -dns -domain-magedu. local -- image- repository- registry . cn hangzhou . al iyuncs . com/goog1e containers
io/ doc
-- ignore-preflight -errors=swap
两条命令都一样,长度都一样,为什么第一条没有成功。只是域名跟地址段不同。初始化成功之后加入节点就是这麽简单,如果有服务器直接通过join节点将它填入进去就可以了。
rootdnodel:~# kubeadm reset102 103都是同样的操作。自己测试可以使用,但是在公司不可以使用,因为是一种不可恢复的操作。
第二种初始化方式:基于文件初始化高可用master方式:
两种方式任意选择一种成功就可以,
# kubeadm config print init defaults #输出默认初始化配置。
先拿到默认的初始化信息,追加一下默认的初始化信息,将它追加成一个文件,
rootgkubeadm- sterti # kubeadm config print init-defaults > kubeadm- init. Yml
因为这个文件中很多值都是默认的,所以需要更改,
Ttl:48h 0m 0s
而且通过kubeadm初始化时也可以更改这个有效期。
advertiseAddress:172.31.3103
监听地址是本机的
cIrSocket:/var/run/dockershim.sock文件不需要更改保持默认就可以。
name: kubeadm- masterl,magedu . net
taints
effect: NoSchedule
key: node- role . kube rnetes . i0/ master
apiSe rve r :
timeoutForControlPLane: 4m0s
apiVe rsion: kubeadm. k8s . io/ vlbeta2
ce rtificatesDir: /etc/kubernetes/ pki
cluste rName: kube rnetes
controllerManager:
controllerManager:
Kubernetes version:v1.17.2
Dnsdomain :linux39.local
Service subnet:192.168.1.0/20
此地址不要使用国网地址,一定要使用私网地址。
补全地址:
注意这个过程不能使用tab键,要使用空格的方式来写,core仍旧使用coredns来写就行,
imageRepository: registry . cn-hangzhou . aliyuncs . com/ google containers镜像地址要改成阿里云的,要使用谷歌地址肯定是不行的,或者使用代理或者翻墙。
还缺少一个VIP的地址:
clusterlame kubermetes
controlPlaneEndpoint: 172.31.3.248:6443然后确定一下行数,此时是26行。复制文件过来确定两个都是四十行。
进行初始化:
# kubeadm init -config kubeadm-init,yaml #基 于文件执行k8s master初始化。
root@kubeadm- master1:~# kubeadm init --config kubeadm init . yml此时负载均衡要改成101,因为现在只有101这块装adm,
root@kubeadm- masterl:-# LL /root/ ku^C
root@kubeadm- masterl:~# mkdir -P SHOME/ . kube
root@kubeadm- masterl:~#
root@kubeadm- masterl:~# sudo cp -i /etc/ kubernetes/ admin. conf $HOME/ . kube/config
root@kubeadm- masterl:-#
root@kubeadm- masterl:-#
sudo chown $(id u):$(id -g) SHOME/ . kube/config
root@kubeadm-master1l:~# ll
root@kubeadm masterl:-# wget https://raw. githubusercontent . com/ coreos/ flannel/ maste r/Documentation/kube . flannel. ymL
查看flannel文件是否能通,
root@kubeadm-masterl:~# wget https : //raw. githubusercontent . com/coreos/ flannel/ master /Documentation/ kube- flannel . ymL --2020-03-27 15:18:00-- https:// raw. githubuse rcontent .com/ coreos/ flannel/ maste r/Documentat ion/kube flannel. Yml
Resolving raw. githubuse rcontent. com ( raw . githubuse rcontent,com)..
root@kubeadm-master1:~# wget https:// raw. githubuse rcontent,com/ coreos/ flannel/ maste r/Documentat ion/ kube- flannel. Yml
或者打开后手动创建一下这个文件,
root@kubeadm-master1:~#vim flannel.Yml
然后将文件复制粘贴下下来,
Nerwork:“192.168.0.0/20”就可以直接创建就可以。
运行网络组件:
root@kubeadm- master1:~# kubectl apply -f flannel. Yml
按照之前方法将其他master节点和nobe节点都添加进来。
root@kubeadm-masterl:-# kubeadm init phase upLoad-certs --upload-certs
--ce rti f icate- key 2675 fddcc0fe36799bc2 689a2759c725a71c5d9cf 491 f f 3d0b96265dbc 6a0038
在102跟·103节点中分别执行,就添加成功了。
PLease, check the contents of the $HOME/ ,kube/config file.
root@kubeadm- master3:~# kubeadm join 172 .31.3.248:6443. token abcdef . 0123456789abcdef )
discovery- token-ca-cert -hash sha256 : 0e06f649c fb8dce5bcad 1a882283ca93308fc4fbfbb77a4ff19ad7fc758b4a5
-control-plane --certificate- key 2675fddcc0fe36799bc2689a2759c725a71c5d9cf491f f3d0b96265dbc6a0038
加入nobe节点:root@node1:~# kubeadm join 172. 31.3.248:6443.. token abcdef . 0123456789abcdef \
--discovery- token-ca-cert -hash sha256: 0e06f649c fb8dce5bcadc 1a882283c a93308fc4fbfbb77a4ff19ad7 fc758b4a5]
两种方式任选其一初始化成功就可以,来回初始化,只是为了说明两种方式都可以。
root@kubeadm- masterl:~# kubectl get nodes
NAME STATUS
ROLES
AGE
VERS ION
kubeadm- maste r1. magedu,net
Ready
master
4m43s
v1.17.2
kubeadm- master2. magedu .net
Ready
maste r
54s
v1.17.2
rootakubeadm- masterl:~# kubectl
get nodes
确保两种节点都加入进去并且ready,集群就创建成功了,之后就是进行跑服。
Ready之后就可以了,意思就是说集群已经起来了。这两种方式任选其一就可以,但是推荐使用文件的方式,因为当时使用了哪些参数,后期想更改也可以改。如果使用命令初始化,命令记录不太好找。
kubeadm init创建k8s集群流程:
https://k8smeetup.github.io/docs/reference/setup: tools/kubeadm/kubeadm init/finit workflow.