1、方式一:
(1)对master节点而言,将ApiServer、Controller Manager、Scheduler和etcd通通直接安装在master节点上运行
(2)对node节点而言,将kublet、kube-proxy和容器引擎(一般而言,是docker容器)直接安装在node节点上运行
缺点:这种部署方式非常麻烦,这在于:为了提供安全的方式,需要做很多组CA和认证方式(使用https协议进行通信)
2、方式二:
使用K8s专门的集群部署管理工具kubeadm进行部署。
(1)master,nodes节点上:安装kubelet,kubeaedm,和docker
(2)master节点上:kubeadm init。将其中一个节点初始化为master节点,初始化的方式为:将该节点上的组件ApiServer、Controller Manager、Scheduler和etcd都以pod的方式运行。值得注意的是:这些pod都是静态pod,而非K8s管理的动态pod。
(3)nodes节点上:kubeadm join。剩下的节点初始化为node节点,初始化的方式为:将这些节点上的组件kube-proxy以pod的方式运行。值得注意的是:这些pod都是静态pod,而非K8s管理的动态pod。
1、前期准备:
(1)需要在各个节点(包括master节点和各个node节点)上做好解析—在/etc/hosts文件中进行配置
(2)需要各个节点(包括master节点和各个node节点)可以做到时间同步。
(3)需要在各个节点上关闭防火墙服务(firewalld服务或iptables服务),这是因为K8s会大量自动去操作很多iptables规则。
2、部署过程:
(1)安装docker-ce(docker-ce是docker的社区版本,docker-ee是docker的企业版本)、kublet、kubeadm和kubectl(kubectl是客户端访问K8s集群时要用到的命令)。
(2)在master节点上配置docker服务:在/usr/lib/systemd/system/docker.service文件中添加两行环境变量:
Environment="HTTPS_PROXY=http://www.ik8s.io:10080" #这个地址能够帮我们辗转访问到docker镜像
Environment="NO_PROXY=本机地址" #本机地址就不用代理了
配置完docker服务之后,使用命令"systemctl daemon-reload"来重新加载docker服务。
(3)启动dokcer服务并设置docker服务为开机自启动,设置kubelet服务为开机自启动(此时不需要启动kubelet服务,因为很多组件都还没有配置成功,所以会导致启动失败)。
(4)确保/proc/sys/net//bridge/bridge-nf-call-iptables文件和/proc/sys/net//bridge/bridge-nf-call-ip6tables文件中的值都是1。
(5)在master节点上初始化集群:kubeadm init --kubernetes-version=kubernetes的版本,--pod-network-cidr=pod的网络,--service-cidr=service的网络 --ignore-preflight--errors=Swap(kubeadm init命令的相关参数可以通过命令“kubeadm init --help”查看,其中参数--ignore-preflight--errors=Swap是用来禁用Swap分区的,其中参数--ignore-preflight--errors=Swap的使用还必须结合/etc/sysconfig/kubelet文件,其中/etc/sysconfig/kubelet文件中的内容为KUBELET_EXTRA_ARGS="--fail-swap-on=false")。在初始化集群完成之后,会拉取好镜像apiserver、controller manager 、scheduler、etcd、kube-prox、pause和coredns。
(6)在master节点上安装flannel插件:命令为【kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml】,查找命令的网址为【https://github.com/coreos/flannel】。该命令执行完成之后,会拉取好flannel的镜像(通过命令"docker image ls"来查看),并通过命令"kubectl get pods -n kube-system -o wide"来查看flannel插件的相关pod有没有启动成功(其中‘'-n kube-system‘’参数,用来指定命名空间为kube-system,"-o wide"参数用来获取扩展信息)。
(1)同master节点的(1)
(2)同master节点的(2)
(3)同master节点的(3)
(4)同master节点的(4)
(5)按照初始化集群结束后的提示(master上的(5)返回的结果)在nodes节点上进行操作。加入集群之后,需要使用命令"docker image ls"查看是否拉取好了kube-proxy镜像和flannel镜像。
1、前期准备:
(1)需要在各个节点(包括master节点和各个node节点)上做好解析—在/etc/hosts文件中进行配置
(2)需要各个节点(包括master节点和各个node节点)可以做到时间同步。
(3)需要在各个节点上关闭防火墙服务(firewalld服务或iptables服务),这是因为K8s会大量自动去操作很多iptables规则。
2、master节点:
(1)在master节点上安装docker-ce
yum install docker-ce -y
(2)在master节点上安装kubelet-1.18.2、kubeadm-1.18.2和kubectl-1.18.2
yum list kubelet kubeadm kubectl --showduplicates | sort -r #查找镜像仓库中有哪些版本的安装包
yum install kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2 -y
(3)启动docker服务,并设置docker服务开机自启;设置kubelet服务开机自启(此时不需要启动kubelet服务,因为很多组件都还没有配置成功,所以会导致启动失败)。
(4)
[root@master ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://oinh00fc.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker
(5)确保/proc/sys/net//bridge/bridge-nf-call-iptables文件和/proc/sys/net//bridge/bridge-nf-call-ip6tables文件中的值都是1。
[root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-iptables
1
[root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-ip6tables
1
(6)禁用Swap(如果不禁用Swap的话,在初始化集群时,会报ERROR错误,无法进行下去)。
[root@master ~]# cat /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
[root@master ~]# systemctl restart kubelet
(7)初始化集群
kubeadm init --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Swap --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
集群初始化完成之后,会拉取好kube-apiserver、kube-controller-manager、kube-scheduler、etcd、pause、coredns和kube-proxy镜像
但是k8s的默认镜像名字应该是下面这样的:
[root@master ~]# kubeadm config images list
所以要修改镜像的名字
#修改镜像的名字
[root@master ~]# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.2 k8s.gcr.io/kube-proxy:v1.18.2
[root@master ~]# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.2 k8s.gcr.io/kube-apiserver:v1.18.2
[root@master ~]# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.2 k8s.gcr.io/kube-scheduler:v1.18.2
[root@master ~]# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.2 k8s.gcr.io/kube-controller-manager:v1.18.2
[root@master ~]# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
[root@master ~]# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7
[root@master ~]# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
#删除原来的镜像
[root@master ~]# docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.2
[root@master ~]# docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.2
[root@master ~]# docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.2
[root@master ~]# docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.2
[root@master ~]# docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
[root@master ~]# docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7
[root@master ~]# docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
(8)kubectl 是管理 Kubernetes Cluster 的命令行工具。Master 初始化完成后需要做一些配置工作,然后 kubectl 就能使用了。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
(9)在master节点上安装flannel插件:
[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
flannel插件安装成功之后,会拉取flannel镜像
(10)查看组件的信息、nodes的信息和pods的信息
#查看component status(简称cs)的状态
[root@master ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
#值得注意的是:看不到apiserver是否健康,这是因为apiserver一定是健康的,如果apiserver不健康,就看不到controller-manager、scheduler和etcd组件是健康的。其中kube-proxy不是以组件的形式展示对额,而是插件的方式,所以看不到。
#查看nodes的状态
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 3h15m v1.18.2
#查看pods的状态
[root@master ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-546565776c-448jk 1/1 Running 1 3h15m
coredns-546565776c-k7whb 1/1 Running 1 3h15m
etcd-master 1/1 Running 2 3h15m
kube-apiserver-master 1/1 Running 2 3h15m
kube-controller-manager-master 1/1 Running 7 3h15m
kube-flannel-ds-amd64-hs2ck 1/1 Running 2 73m
kube-proxy-n7cmq 1/1 Running 2 3h15m
kube-scheduler-master 1/1 Running 7 3h15m
3、nodes节点:
(1)同master节点的(1)
(2)同master节点的(2)
(3)同master节点的(3)
(4)同master节点的(4)
(5)同master节点的(5)
(6)同master节点的(6)
(7)nodes节点加入集群
[root@node02 ~]# kubeadm join 10.0.2.2:6443 --token 6bm3bd.84kn0tr02cxm91uj --discovery-token-ca-cert-hash sha256:a1dc28153a5a8ff9358b5916650baba22b774c91ed95aa9076b40cd426bbd5d5 --ignore-preflight-errors=Swap
加入集群之后,会拉取好kube-proxy、pause和flannel的镜像
4、在master节点上,查看集群是否搭建成功
(1)查看nodes的状态
[root@master ~]# kubectl get nodes #显示Ready则表示成功
NAME STATUS ROLES AGE VERSION
master Ready master 4h19m v1.18.2
node01 Ready 45m v1.18.2
node02 Ready 35m v1.18.2
(2)查看pods的状态
[root@master ~]# kubectl get ns #查看k8s默认的namespace
NAME STATUS AGE
default Active 4h19m
kube-node-lease Active 4h19m
kube-public Active 4h19m
kube-system Active 4h19m
[root@master ~]# kubectl get pods -n kube-system -o wide #都显示为Running,则表示成功
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-546565776c-448jk 1/1 Running 1 4h20m 10.244.0.4 master
coredns-546565776c-k7whb 1/1 Running 1 4h20m 10.244.0.5 master
etcd-master 1/1 Running 2 4h20m 10.0.2.2 master
kube-apiserver-master 1/1 Running 2 4h20m 10.0.2.2 master
kube-controller-manager-master 1/1 Running 7 4h20m 10.0.2.2 master
kube-flannel-ds-amd64-2zd7f 1/1 Running 0 36m 10.0.2.4 node02
kube-flannel-ds-amd64-6b8pq 1/1 Running 0 47m 10.0.2.3 node01
kube-flannel-ds-amd64-hs2ck 1/1 Running 2 138m 10.0.2.2 master
kube-proxy-n7cmq 1/1 Running 2 4h20m 10.0.2.2 master
kube-proxy-qfc2v 1/1 Running 1 47m 10.0.2.3 node01
kube-proxy-vpflj 1/1 Running 1 36m 10.0.2.4 node02
kube-scheduler-master 1/1 Running 7 4h20m 10.0.2.2 master
可以查看别人的博客:https://blog.csdn.net/qq_35887546/article/details/105557420
如何查看k8s中组件apiserver监听哪个端口:
[root@master ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.1:10248 *:*
LISTEN 0 128 127.0.0.1:10249 *:*
LISTEN 0 128 127.0.0.1:2379 *:*
LISTEN 0 128 10.0.2.2:2379 *:*
LISTEN 0 128 10.0.2.2:2380 *:*
LISTEN 0 128 127.0.0.1:2381 *:*
LISTEN 0 128 127.0.0.1:33008 *:*
LISTEN 0 128 127.0.0.1:10257 *:*
LISTEN 0 128 127.0.0.1:10259 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::10250 :::*
LISTEN 0 128 :::10251 :::*
LISTEN 0 128 :::6443 #监听6443端口 :::*
LISTEN 0 128 :::10252 :::*
LISTEN 0 128 :::10256 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*