Linux下Docker k8s集群的搭建部署

一、实验环境(rhel7.3版本)

1.selinux和firewalld状态为disabled

2.各主机信息如下:

主机ip
server1(master,安装好docker,并启动dokcer)—内存至少为1024M,不能为512M。否则集群初始化会失败172.25.83.1
server2(node,安装好docker,并启动docker)—内存可以为512M172.25.83.2
server3(node,安装好docker,并启动docker)—内存可以为512M172.25.83.3

 

3.需要下载的文件和安装包如下:

 

二、Docker k8s集群的搭建部署

 

1三个节点上:下载rpm包:cri-tools-1.12.0-0.x86_64.rpm,kubeadm-1.12.2-0.x86_64.rpm,kubectl-1.12.2-0.x86_64.rpm,kubelet-1.12.2-0.x86_64.rpm和kubernetes-cni-0.6.0-0.x86_64.rpm,并进行安装

[root@server1 k8s]# yum install cri-tools-1.12.0-0.x86_64.rpm kubeadm-1.12.2-0.x86_64.rpm kubectl-1.12.2-0.x86_64.rpm kubelet-1.12.2-0.x86_64.rpm kubernetes-cni-0.6.0-0.x86_64.rpm -y

#server2,server3的安装类似

 

2三个节点上:关闭swap交换分区,否则kubelet会启动不了。

[root@server1 ~]# swapoff -a   #关闭所有的swap分区
[root@server1 ~]# swapon -s   #查看swap分区的挂载信息,以确保所有的swap分区已经关闭
[root@server1 ~]# vim /etc/fstab   #注释掉swap分区开机自动挂载的命令
#/dev/mapper/rhel-swap   swap                    swap    defaults        0 0

#server2,server3上的操作同上

 

3三个节点上开启kubelet服务,并将该服务设置为开机自启动

[root@server1 ~]# systemctl start kubelet.service   #开启kubelet服务 
[root@server1 ~]# systemctl enable kubelet.service   #设置kubelet服务开机自启

#server2,server3上的操作同上
  • 查看kubelet服务的状态,我们会发现该服务启动失败。虽然启动失败,但还是要启动。如果不启动,后续的操作可能会报错

 

4三个节点上列出需要加载的镜像列表,并照着镜像列表加载镜像(共8个镜像)

[root@server1 ~]# kubeadm config images list   #列出需要加载的镜像列表
I0328 09:37:39.032003   18274 version.go:93] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get https://dl.k8s.io/release/stable-1.txt: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
I0328 09:37:39.032158   18274 version.go:94] falling back to the local client version: v1.12.2
k8s.gcr.io/kube-apiserver:v1.12.2
k8s.gcr.io/kube-controller-manager:v1.12.2
k8s.gcr.io/kube-scheduler:v1.12.2
k8s.gcr.io/kube-proxy:v1.12.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.2.24
k8s.gcr.io/coredns:1.2.2

[root@server1 k8s]# docker load -i kube-apiserver.tar
[root@server1 k8s]# docker load -i kube-controller-manager.tar
[root@server1 k8s]# docker load -i kube-scheduler.tar 
[root@server1 k8s]# docker load -i kube-proxy.tar 
[root@server1 k8s]# docker load -i pause.tar
[root@server1 k8s]# docker load -i etcd.tar 
[root@server1 k8s]# docker load -i coredns.tar
[root@server1 k8s]# docker load -i flannel.tar   #后面的操作需要使用该镜像

#serve2,server3上的操作同上
  • docker  images

 

5在server1(master节点)上初始化集群(k8s)

[root@server1 k8s]# kubeadm init \
> --pod-network-cidr=10.244.0.0/16 \  #该参数表示我们选择的网络组件是Flannel,所以我们之前加载了flannel的镜像。其中10.244.0.0./16这个IP地址来源于kube-flannel.yml文件的内容
>-apiserver-advertise-address=172.25.83.1  #通过该IP地址向集群其他节点公布api server的信息,必须能够被其他节点访问(这里指定的是server1的eth0网卡上显示的IP地址)
  • vim  kube-flannel.yml

  • 显示下面的信息,表示集群初始化成功(其中设置dokcer服务开机自启的警告信息可以不用管)


值的注意的是:如果第一次初始化集群失败,需要执行命令"kubeadm  reset"进行重置,重置之后再执行初始化集群的命令,进行集群初始化。


 

6在server1(master节点)上根据上一步结果(初始化集群的结果)的提示信息进行操作

[root@server1 k8s]# useradd k8s   #添加一个普通用户,用户名随意给。我这里指定的是k8s用户
[root@server1 k8s]# vim /etc/sudoers   #编辑/etc/sudoers文件,给k8s用户赋予所有的权限。按wq!保存退出(或者编辑visudo文件,按wq保存退出)
92 k8s     ALL=(ALL)       NOPASSWD: ALL
[root@server1 k8s]# su - k8s   #切换到普通用户进行下面的操作
[k8s@server1 ~]# mkdir -p $HOME/.kube
[k8s@server1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[k8s@server1 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 查看编辑后的/etc/sudoers文件

 

7在server1(master节点)上解决kubectl命令不补全的问题

[k8s@server1 ~]$ echo "source <(kubectl completion bash)" >> ./.bashrc
[k8s@server1 ~]$ logout   #需要退出,重新连接一下才能生效
[root@server1 k8s]# su - k8s
Last login: Thu Mar 28 10:19:26 CST 2019 on pts/0
#此时会发现kubectl命令能补全了

 

8在server1(master节点)上将kube-flannel.yml文件发送到/home/k8s目录下。因为kube-flannel.yml文件原来的/root/k8s目录下,普通用户k8s无法访问。并根据初始化集群的提示,继续操作

[k8s@server1 ~]$ logout      
[root@server1 k8s]# cp kube-flannel.yml /home/k8s/   
[root@server1 k8s]# su - k8s
[k8s@server1 ~]$ kubectl apply -f kube-flannel.yml 

  • 查看运行的容器

 

9在server2和server3(node节点)上:根据master节点初始化集群的结果提示,加入集群。

[root@server2 ~]# kubeadm join 172.25.83.1:6443 --token owrfh4.9gbsw8k4kszo1fi1 --discovery-token-ca-cert-hash sha256:c4c6007dd0aca8439c87c6ff9b1c5f39ce2933ce064479c00fba963ddae5c7d3

#server3上的操作同上

  • 显示如下信息,表示加入集群的操作成功了


值的注意的是:如果第一次加入集群失败,需要执行命令"kubeadm  reset"进行重置,重置之后再执行加入集群的命令


 

#根据警告信息,进行操作(其中设置dokcer服务开机自启的警告信息可以不用管)
[root@server2 ~]# modprobe ip_vs_sh 
[root@server2 ~]# modprobe ip_vs_wrr

#server3上的操作同上
  • 查看server2节点上运行的容器(server3的操作类似)

 

10在server1(master节点)上进行测试

  • 获取默认namaspace(default)下的pod,以查看及全的所有节点的状态是否都是Ready。

  • 获取所有namespace下的pod,以查看所有的pod的状态是否都是Running


从上图我们可以看到,由两个namespace的状态是CrashLoopBackOff,这是不正确的。那么该怎么解决呢?

答:

  • 1.在物理机上,设置iptables的策略,使得虚拟机server1,server2,server3能够上网
[root@foundation83 ~]# iptables -t nat -I POSTROUTING -s 172.25.83.0/24 -j MASQUERADE

做好iptables策略之后,稍等一会儿,(大概1分钟左右)再次查看状态,看是否是Running状态,如果不是,再执行第2步操作。一般执行第1步操作之后,就会成功。

  • 2.执行命令删除,状态不是Running的namespace
[k8s@server1 ~]$ kubectl describe pod coredns-576cbf47c7-qsz27 -n kube-system
[k8s@server1 ~]$ kubectl describe pod coredns-576cbf47c7-wzgv9 -n kube-system
#删除之后,不用手动添加,系统会自动添加。



###补充###
[k8s@server1 ~]$ kubectl logs coredns-576cbf47c7-qsz27 -n kube-system   #查看节点coredns-576cbf47c7-qsz27的日志信息
[k8s@server1 ~]$ kubectl logs coredns-576cbf47c7-wzgv9 -n kube-system   #查看节点coredns-576cbf47c7-qsz27的日志信息
[k8s@server1 ~]$ kubectl get deployment -n kube-system   #查看deployment资源,这是用来查看名为kube-systemc的deployment的状态。说白了就是看k8s集群的部署状态。
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
coredns   2         2         2            2           90m

#"kubectl get deployment -n kube-system"命令执行结果中的参数解释
DESIRED: 期望部署副本数
CURRENT: 当前部署副本数
UP-TO-DATE:最新部署副本数
AVAILBLE: 运行中的副本数
AGE: 已经运行的时间

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值