口口相传如何在服务器上配置k8s+Docker

本文所涉及到的关键字

Docker配置CentOS 7服务器配置环境配置扫雷填坑

背景介绍

近期想试试看容器自动化部署,在看了一些经验交流,Docker官方文档,同性交友网站的一些热点项目后,觉得纸上得来终觉浅,准备动手实操一下,基本的狗血就是k8s+Docker那一套,然后搭配GoLang或者Python定制化一些功能用,本以为环境配置会很方便,结果踩了一下午的地雷,在此把服务器环境配置的一些我觉得比较坑的点分享给大家。

#0 VM及OS内核检查

检查内核版本,Docker官方推荐3.8+

# 检查内核版本
uname -r

如果是2.x内核版本,例如RedHat6等,那么还要升级下系统。

既然是要玩耍k8s,那么自然需要若干台机器做出主从的结构,那么我们暂且设计一个一主两从的集群来看看,如下:

MASTER master
SLAVE#1 slave-1
SLAVE#2 slave-2

先把这几台机器安装好,接下来就要确保处于一个网段内并能互通,进入下一个检查点。

#1 网络

先进入到 slave 机器
检查下外网通否

ping www.baidu.com

在这里插入图片描述
hmmmmm…竟然不通
那检查下DNS配置是否正常

检查DNS配置

# 查看网卡配置
vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

enp0s3是网卡名 可通过tab补全获得本机的网卡信息

添加下DNS配置

DNS1=201.106.0.20
DNS2=8.8.8.8

顺便检查下网卡是否开启

ONBOOT=“yes”

:wq

顺便

vi /etc/resolv.conf

DNS1=201.106.0.20
DNS2=8.8.8.8

:wq

重启下网络配置

/etc/init.d/network restart

再检验一下网络 走起

ping www.baidu.com
PING www.a.shifen.com (180.101.49.12): 56 data bytes
64 bytes from 180.101.49.12: icmp_seq=0 ttl=51 time=8.558 ms
64 bytes from 180.101.49.12: icmp_seq=1 ttl=51 time=9.210 ms
64 bytes from 180.101.49.12: icmp_seq=2 ttl=51 time=8.683 ms
64 bytes from 180.101.49.12: icmp_seq=3 ttl=51 time=10.091 ms
64 bytes from 180.101.49.12: icmp_seq=4 ttl=51 time=8.949 ms
64 bytes from 180.101.49.12: icmp_seq=5 ttl=51 time=8.770 ms
^C
--- www.a.shifen.com ping statistics ---
6 packets transmitted, 6 packets received, 0.0% packet loss

看起来一切正常

获取下当前的ip地址

inet 10.0.1.14/24 brd …

再看一下另外几台机器,ip地址有点紊乱,那么为了保证后续的顺畅,我们再配置一下这几台机器,使其工作在同一网段。

配置网关,IP地址
还是回到熟悉的地方

vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

加上 IPADDR NETMASK GATEWAY NETWORK

IPADDR=192.168.111.2
NETMASK=255.255.255.0
GATEWAY-192.168.111.1
NETWORK=192.168.111.0

注意
检查下网卡的类型,建议设置成static,默认的是dhcp

BOOTPROTO=static
如果用不到ipv6之类的配置页可以把IPV6相关的配置统统注释掉

然后 重启加网卡

/etc/init.d/network restart

更新下我们整个主从结构的信息

MASTER master 192.168.111.2
SLAVE#1 slave-1 192.168.111.3
SLAVE#2 slave-2 192.168.111.4

互相PING校验下网络
结果是喜闻乐见的,但在ping的过程中,我在不同的VM中反复切换(横跳),十分的麻烦,那就随手配置下互信吧

互信配置
我们就配置master这台机器可以免密登录至子节点机器slave

ssh-keygen -t rsa

一路回车 默认将key生成在

/root/.ssh/id_rsa.pub

在这里插入图片描述
id_rsa.pub 是公钥 id_rsa 是私钥 不要弄错了

然后就是将master的公钥拷贝到slave上

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.111.4 -p 22

输入111.4 这台机器的密码
在这里插入图片描述
这里会看到已经提示添加成功了,可以ssh登录试一下

ssh 192.168.111.4 -p 22

OK,到这里呢 主机和从机的互信,网络等等,已经打通了。
接下来就要开始安装docker了,结果还是有坑…

#2 安装Docker

网络已通,安装Docker有什么难的?

yum -y install docker

静静的等待,不就安装好了吗?
hmmmm…
在这里插入图片描述
获取镜像地址超时了,开始解决yum镜像地址问题

解决yum源问题
众所周知 阿里云提供了CentOS的 yum源,于是依葫芦画瓢
阿里云yum源 https://opsx.alibaba.com/mirror 根据列表选择 CentOS 7,然后复制黏贴神奇命令行

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

然后发现

-bash: wget: command not found

我们的服务器上并没有装 wget,在官方文档上 也推荐了用 curl进行安装,于是复制黏贴神奇命令行

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

很多小伙伴应该到此就可以把yum源配置成阿里云的源了,但笔者发现一杯茶的功夫过去了,源配置依然纹丝不动
在这里插入图片描述
猜测出于神秘力量的原因,阿里云无法访问,但好在经过一番摸索,发现了另外的 清华yum源
站点上有着详细的步骤告诉如何配置CentOS镜像
核心原理就是将 老的 CentOS-Base.repo文件替换成有可用源配置的新 .repo
https://mirrors.cnnic.cn/help/centos/ 已经有详细的步骤了,就不再赘述

刚才提到了wget 未安装的问题,就顺便解决下 wget

安装wget
为什么要提这个呢?在探索配置yum源的过程中,也有博文提到了用wget去配置新的yum源,但当中不乏有博主提出重装yum,思路是对,但这是在wget可用的前提下,如果wget都不可用,让人家把yum卸载了重装,这不是绕弯路么?
正确的安装姿势如下
1 下载rpm包

下载wget的rpm包:http://mirrors.163.com/centos/7/os/x86_64/Packages/

2 将rpm包拷贝到需要安装的机器上

scp -P 22 [安装包路径] root@your.slave.ip.address:[安装地址]

scp -P 22 wget-1.14-18.el7_6.1.x86_64.rpm root@192.168.111.4:/usr/local/

3 安装rpm包

rpm -ivh wget-1.14-18.el7_6.1.x86_64.rpm

wget 就安装完成了,回到起点,运行神奇命令行

yum -y install docker

到此,Docker就安装完成了,其中的坑各位又遇到多少个?
基础的都调好了,别忘了我们的核心目的,玩耍k8s,接下来就是
k8s 相关组件的章节了

#3 k8s那些事儿

啥是k8s
首先k8s 是基于 docker 技术之上的应用,提供了一系列容器化管理的功能。详细了解k8s可以移步 k8s官网

k8s关键词
首先 k8s 是一个主从结构,有Master管理Minion

Master中的关键组件
kube-scheduler
kube-apiserver
kube-controller-manager
etcd

Minion中的关键组件
kube-proxy
kubelet
docker
flanneld

关于这些组件 Kubernets系统架构简介 中有更具体的介绍

配置k8s MASTER

我们一个个组件配置,安装上述涉及到的组件

yum install -y docker kubernetes-master etcd 

配置etcd

vi /etc/etcd/etcd.conf

修改几个关键配置

#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS=“http://192.168.111.2:2380”
ETCD_LISTEN_CLIENT_URLS=“http://192.168.111.2:2379”,“http://127.0.0.1:2379”
ETCD_INITIAL_ADVERTISE_PEER_URLS=“http://192.168.111.2:2380”
ETCD_INITIAL_CLUSTER=“192.168.137.4=http://192.168.111.2:2380”
ETCD_INITIAL_CLUSTER_STATE=“new”
ETCD_INITIAL_CLUSTER_TOKEN=“etcd-cluster”
ETCD_ADVERTISE_CLIENT_URLS=“http://192.168.111.2:2379”

#[Clustering]
ETCD_ADVERTISE_CLIENT_URLS=“http://192.168.111.2:2379”

注意
ETCD_LISTEN_PEER_URLS
ETCD_LISTEN_CLIENT_URLS ETCD_INITIAL_ADVERTISE_PEER_URLS ETCD_ADVERTISE_CLIENT_URLS ETCD_INITIAL_CLUSTER
这几个参数都修改为MASTER的地址

配置kubernets config

vi /etc/kubernetes/config

配置修改如下

#How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="–master=http://192.168.111.2:8080"

KUBE_MASTER
即为MASTER暴露给网段内的访问地址

配置kubernetes apiserver

vi /etc/kubernetes/apiserver

#Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="–etcd-servers=http://192.168.111.2:2379"

KUBE_ETCD_SERVERS
将其修改为MASTER的地址

配置kubernetes controller-manager

vi /etc/kubernetes/controller-manager

#Add your own!
KUBE_CONTROLLER_MANAGER_ARGS="–node-monitor-grace-period=10s --pod-eviction-timeout=10s"

启动MASTER

for service in etcd kube-apiserver kube-controller-manager kube-scheduler; do 
systemctl enable $service 
systemctl restart $service 
systemctl status $service 
done

配置k8s MINION

继续安装上述的组件

yum install -y docker kubernetes-node flannel

配置kubernetes config

vi /etc/kubernetes/config

配置修改如下

#How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="–master=http://192.168.111.2:8080"

KUBE_MASTER
即为MASTER暴露给网段内的访问地址

配置kubelet

vi /etc/kubernetes/kubelet

配置修改如下

#You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="–hostname-override=192.168.111.3"
#location of the api-server
KUBELET_API_SERVER="–api-servers=http://192.168.111.2:8080"

KUBELET_HOSTNAME
为MINION的IP地址
KUBELET_API_SERVER
为MASTER暴露给网段内的访问地址

配置flannel

vi /etc/sysconfig/flannedld

#etcd url location. Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS=“http://192.168.111.3:2379”
#etcd config key. This is the configuration key that flannel queries
#For address range assignment
FLANNEL_ETCD_PREFIX="/coreos.com/network"

FLANNEL_ETCD_ENDPOINTS
为MASTER配置的etcd暴露出来的地址
FLANNEL_ETCD_PREFIX
为在当前环境内etcd标识flannel的前缀

验证可用性
现在已知配置都正确配置了,节点之间的网络也是正常的(可以ping通),在开始下一步之前,验证一下master的etcd,apiserver可用性如何
用一下神奇小命令行

telnet 192.168.111.2 2379

发现不通,超时

telnet 192.168.111.2 2380

发现不通,超时
疑似master的防火墙端口未放行
那就放行下 2379 2380 8080 这几个端口

firewall-cmd --zone=public --add-port=2379/tcp --permanent
firewall-cmd --zone=public --add-port=2380/tcp --permanent
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all

或者

iptables -F

再次验证一下,通过

MASTER 配置docker网段
验证etcd可用性后,分配docker网段

etcdctl mk /coreos.com/network/config '{"Network":"192.169.0.0/16", "SubnetMin": "192.169.1.0", "SubnetMax": "192.169.254.0"}'

mk
make a new key with a given value

etcdctl set /coreos.com/network/config '{ "Network": "192.169.0.0/16" }'

set
set the value of a key

在这里我设置了192.169网段去分配给docker使用,只是为了更明显的区分,避免网段混在一起

MINION启动相关服务

for SERVICES in kube-proxy kubelet docker flanneld; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done

验证MASTER及MINION

master验证minion是否正常挂载

etcdctl ls /coreos.com/network/subnets/

/coreos.com/network/subnets/192.169.78.0-24
/coreos.com/network/subnets/192.169.66.0-24

kubectl get nodes

NAME STATUS AGE
192.168.111.3 Ready 22h
192.168.111.4 Ready 22h

minion验证docker

ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:2a:00:21 brd ff:ff:ff:ff:ff:ff
    inet 192.168.111.3/24 brd 192.168.111.3 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe2a:21/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:fe:34:a9:08 brd ff:ff:ff:ff:ff:ff
    inet 192.169.78.1/24 scope global docker0
       valid_lft forever preferred_lft forever
6: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none
    inet 192.169.78.0/16 scope global flannel0
       valid_lft forever preferred_lft forever
    inet6 fe80::8d74:4c4d:4ac5:b372/64 scope link flags 800
       valid_lft forever preferred_lft forever

flannel和docker网段相同,都为192.168,配置成功

【待续,先搬会砖…】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值