云服务器上搭建kubernetes集群

使用的虚机百度云BCC,centos7.5 ,2核4G

yum源百度云官方自带yum源,腾讯,阿里云自带yum源都可参考该文档

搭建k8,一共三台虚机:

1
2
3
master 192.168.0.8		master跟etcd共用一台
minion1 192.168.0.9
minion2 192.168.0.10

百度云虚机自带yum源就可以下载
三台虚机都需要安装

1
2
3
[root@master ~]# yum -y install kubernetes etcd flannel ntp
[root@minion1 ~]# yum -y install kubernetes etcd flannel ntp
[root@minion2 ~]# yum -y install kubernetes etcd flannel ntp

关闭防火墙 三台同样需要关闭 注:若是生产环境不必关闭,写firewalld rule

1
2
3
[root@master ~]# systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld
[root@minion1~]# systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld
[root@minion2~]# systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld

在hosts文件添加以下内容,执行一台,剩余拷贝就ok

1
2
3
4
5
6
7
[root@master ~]# vim /etc/hosts
192.168.0.8 master
192.168.0.8 etcd
192.168.0.9 minion1
192.168.0.10 minion2
[root@master ~]# scp /etc/hosts 192.168.0.9:/etc/
[root@master ~]# scp /etc/hosts 192.168.0.10:/etc/

在master上配置etcd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@master ~]# vim /etc/etcd/etcd.conf 
改:2 ETCD NAME=default
为:2ETCD_NAME="etcd"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
改:9 ETCD_LISTEN_CLIENT_URLS="http://localhost:2379"
为:ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://192.168.0.8:2379"
改:20 ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"
为:ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.8:2379"
注释: advertise [aedvetarz] 做广告,做宣传;通告,通知
/etc/etcd/etcd.conf 配置文件含意如下:
ETCD_NAME="etcd"
etcd节点名称,如果etcd 集群只有一台etcd,这一项可以注释不用配置,默认名称为 default,这
个名宇后面会用到。
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
etcd 存储数据的目录
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://192.168.1.63:2379"
etcd 对外服务监听地址,一般指定2379端口,如果为0.0.0.0将会监听所有接口
ETCD_ARGS=""

需要额外添加的参数,可以自己添加,etcd 的所有参数可以通过etcd-h查看。
启动服务

1
2
3
4
5
6
7
8
9
10
[root@master ~]# systemctl start etcd
[root@master ~]# systemctl status etcd
[root@master ~]# systemctl enable etcd
[root@master ~]# netstat -anptu | grep 2379
tcp 0 0 127.0.0.1:2379 0.0.0.0:* LISTEN 2963/etcd
tcp 0 0 192.168.0.8:2379 0.0.0.0:* LISTEN 2963/etcd
tcp 0 0 192.168.0.8:38866 192.168.0.8:2379 ESTABLISHED 2963/etcd
tcp 0 0 127.0.0.1:2379 127.0.0.1:45804 ESTABLISHED 2963/etcd
tcp 0 0 192.168.0.8:2379 192.168.0.8:38866 ESTABLISHED 2963/etcd
tcp 0 0 127.0.0.1:45804 127.0.0.1:2379 ESTABLISHED 2963/etcd

检查etcd集群列表,这里只有一台

1
2
[root@master ~]# etcdctl member list
8e9e05c52164694d: name=etcd peerURLs=http://localhost:2380 clientURLs=http://192.168.0.8:2379 isLeader=true

在master配置master
修改kubernetets配置文件

1
2
3
[root@master ~]# vim /etc/kubernetes/config 
改:KUBE_MASTER="--master=http://127.0.0.1:8080"
为:KUBE_MASTER="--master=http://192.168.0.8:8080"

修改apiserver配置文件

1
2
3
4
5
6
7
8
9
10
11
[root@master ~]# vim /etc/kubernetes/apiserver
[root@xuegod63 ~]# vim /etc/kubernetes/apiserver
改:8 KUBE_API_ADDRESS="--insecure-bind-address=127.0.0.1"
为:8 KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0
改:17 KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
为:KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.0.8:2379"
改23行:
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExist
s,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
为:KUBE_ADMISSION_CONTROL="--admission-control=AlwaysAdmit" #这里必须配置
正确

配置kube-controller-manager配置文件
默认不需要改动

1
[root@master ~]# cat /etc/kubernetes/controller-manager 

配置kube-scheduler配置文件

1
2
3
[root@master ~]# vim /etc/kubernetes/scheduler 
改:KUBE_SCHEDULER_ARGS=" "
为:KUBE_SCHEDULER_ARGS="0.0.0.0"

设置etcd网络

1
2
3
[root@master ~]# etcdctl set /k8s/network/config '{"Network":"10.255.0.0/16"}'   //用于存储flanneld网络信息
[root@master ~]# etcdctl get /k8s/network/config //查看
{"Network":"10.255.0.0/16"}

配置flanneld服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@master ~]# vim /etc/sysconfig/flanneld 
改:4FLANNEL_ETCD_ENDPOINTS="http://127.0.0.1:2379"
为:4FLANNEL_ETCD_ENDPOINTS="http://192.168.0.8:2379"
改:8 FLANNEL_ETCD_PREFIX="/atomic.io/network"
为:8 FLANNEL_ETCD_PREFIX="/k8s/network"
#注其中/k8s/network 与上面 etcd 中的 Network 对应
改:11 #FLANNEL_OPTIONS=""
为:11 FLANNEL_OPTIONS="--iface=eth0" #指定 通信的物理网卡
[root@master ~]# systemctl restart flanneld.service
[root@master ~]# systemctl status flanneld.service
[root@master ~]# cat /run/flannel/subnet.env //查看/run/flannel/subnet.env 子网信息
FLANNEL_NETWORK=10.255.0.0/16
FLANNEL_SUBNET=10.255.6.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false

之后会有一个脚本姜subnet.env转写程一个docker的环境变量文件/run/flannel/docker
docker0的地址是由 /run/flannel/subnet.env 的FLANNEL_SUBENT参数决定的

1
2
3
4
5
[root@master ~]# cat /run/flannel/docker 
DOCKER_OPT_BIP="--bip=10.255.6.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=true"
DOCKER_OPT_MTU="--mtu=1472"
DOCKER_NETWORK_OPTIONS=" --bip=10.255.6.1/24 --ip-masq=true --mtu=1472"

启动master上的4个服务

1
2
3
[root@master ~]# systemctl restart kube-apiserver kube-controller-manager kube-scheduler flanneld
[root@master ~]# systemctl status kube-apiserver kube-controller-manager kube-scheduler flanneld
[root@master ~]# systemctl enable kube-apiserver kube-controller-manager kube-scheduler flanneld

到此master和etcd节点配置成功

配置minion1,采用flannel方式

1
2
3
4
5
6
7
8
[root@minion1 ~]# vim /etc/sysconfig/flanneld 
改:4FLANNEL_ETCD_ENDPOINTS="http://127.0.0.1:2379"
为:4FLANNEL_ETCD_ENDPOINTS="http://192.168.0.8:2379"
改:8 FLANNEL_ETCD_PREFIX="/atomic.io/network"
为:8 FLANNEL_ETCD_PREFIX="/k8s/network"
#注其中/k8s/network 与上面 etcd 中的 Network 对应
改:11 #FLANNEL_OPTIONS=""
为:11 FLANNEL_OPTIONS="--iface=eth0" #指定 通信的物理网卡

配置minion1上的master地址和kube-proxy

1
2
3
[root@minion1 ~]# vim /etc/kubernetes/config 
改:KUBE_MASTER="--master=http://127.0.01:8080"
为:KUBE_MASTER="--master=http://192.168.0.8:8080"

kube-proxy默认不需要改动

1
2
[root@minion1 ~]# grep -v '^#' /etc/kubernetes/proxy 
KUBE_PROXY_ARGS=""

配置minion1 kubelet

1
2
3
4
5
6
7
8
9
10
11
[root@minion1 ~]# vim /etc/kubernetes/kubelet 
改:5 KUBELET_ADDRESS="--address=127.0.0.1"
为:5KUBELET_ADDRESS="--address=0.0.0.0" #默认只监听127.0.0.1,要改成:0.0.0.0,
因为后期要使用kubectl 远程连接到kubelet 服务上,来查看 pod 及 pod 中容器的状态。如果是 127
就无法远程连接kubelet服务。
改:11 KUBELET_HOSTNAME="--hostname-override=127.0.0.1"
为:11 KUBELET_HOSTNAME="_-hostname-override=minion1" # minion 的主机名,设置
成和本主机机名一样,便于识别。
改:14 KUBELET_API_SERVER="--api-servers=http://127.0.0.1:8080"
为:14 KUBELET_API_SERVER="--api-servers=http://192.168.0.8:8080" #批定 apiserver
的地址

启动minion1服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@minion1 ~]# systemctl restart flanneld kube-proxy kubelet docker
[root@minion1 ~]# systemctl enable flanneld kube-proxy kubelet docker
[root@minion1 ~]# systemctl status flanneld kube-proxy kubelet docker
查看
[root@minion1 ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 10.255.90.1 netmask 255.255.255.0 broadcast 0.0.0.0
ether 02:42:0c:ce:9d:7d txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1472
inet 10.255.90.0 netmask 255.255.0.0 destination 10.255.90.0
inet6 fe80::6062:c456:9093:278b prefixlen 64 scopeid 0x20<link>
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3 bytes 144 (144.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

查看kube-proxy

1
2
3
4
[root@minion1 ~]# netstat -antup | grep proxy
tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 3242/kube-proxy
tcp 0 0 192.168.0.9:53976 192.168.0.8:8080 ESTABLISHED 3242/kube-proxy
tcp 0 0 192.168.0.9:53974 192.168.0.8:8080 ESTABLISHED 3242/kube-proxy

配置minion2,采用flannel方式,和minion1配置一样
这里 直接将minion1的的配置文件拷贝到minion2了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@minion1 ~]# scp /etc/sysconfig/flanneld 189.168.0.10:/etc/sysconfig/
再次确认拷贝正确
[root@minion2 ~]# grep -v '^#' /etc/sysconfig/flanneld

FLANNEL_ETCD_ENDPOINTS="http://192.168.0.8:2379"

FLANNEL_ETCD_PREFIX="/k8s/network"

FLANNEL_OPTIONS="--iface=eth0"
[root@minion2 ~]# systemctl start flanneld.service
[root@minion2 ~]# ifconfig
flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1472
inet 10.255.50.0 netmask 255.255.0.0 destination 10.255.50.0
inet6 fe80::435b:45bf:df6b:58c prefixlen 64 scopeid 0x20<link>
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2 bytes 96 (96.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

配置minion2上的地址和kube-proxy
这里也直接拷贝minion1的配置文件了

1
2
3
4
5
6
7
8
[root@minion1 ~]# scp /etc/kubernetes/config 192.168.0.10:/etc/kubernetes/
[root@minion1 ~]# scp /etc/kubernetes/proxy 192.168.0.10:/etc/kubernetes/
[root@minion2 ~]# systemctl start kube-proxy
[root@minion2 ~]# netstat -anptu | grep proxy
tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 29942/kube-proxy
tcp 0 0 192.168.0.10:59170 192.168.0.8:8080 ESTABLISHED 29942/kube-proxy
tcp 0 0 192.168.0.10:59168 192.168.0.8:8080 ESTABLISHED 29942/kube-proxy
tcp 0 0 192.168.0.10:59166 192.168.0.8:8080 ESTABLISHED 29942/kube-proxy

配置minion2 kubelet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@minion1 ~]# scp /etc/kubernetes/kubelet 192.168.0.10:/etc/kubernetes/
root@192.168.0.10 password:
kubelet 100% 613 1.6MB/s 00:00
[root@minion2 ~]# vim /etc/kubernetes/kubelet
改:KUBELET_HOSTNAME="--hostname-override=minion1"
为:KUBELET_HOSTNAME="--hostname-override=minion2"
[root@minion2 ~]# systemctl start kubelet
[root@minion2 ~]# netstat -antup | grep 8080 //查看:已建立连接
tcp 0 0 192.168.0.10:59216 192.168.0.8:8080 TIME_WAIT -
tcp 0 0 192.168.0.10:59168 192.168.0.8:8080 ESTABLISHED 29942/kube-proxy
tcp 0 0 192.168.0.10:59212 192.168.0.8:8080 ESTABLISHED 32339/kubelet
tcp 0 0 192.168.0.10:59214 192.168.0.8:8080 ESTABLISHED 32339/kubelet
tcp 0 0 192.168.0.10:59218 192.168.0.8:8080 ESTABLISHED 32339/kubelet
tcp 0 0 192.168.0.10:59166 192.168.0.8:8080 ESTABLISHED 29942/kube-proxy
tcp 0 0 192.168.0.10:59210 192.168.0.8:8080 ESTABLISHED 32339/kubelet
[root@minion2 ~]# systemctl restart flanneld kube-proxy kubelet docker
[root@minion2 ~]# systemctl enable flanneld kube-proxy kubelet docker
[root@minion2 ~]# systemctl status flanneld kube-proxy kubelet docker

ifconfig查看docker0 IP minion1和minion2是不一样的

到master主机上查看集群运行状态

1
2
3
4
[root@master ~]# kubectl get nodes
NAME STATUS AGE
minion1 Ready 26m
minion2 Ready 7m

到此整个集群搭建完成

总结:kubernetes 每个节点需要启动的服务和开放端口号
在本实验中kubernetes4个结点一共需要启动13个服务,开6个端口号。
详情如下:~
etcd:一共1个服务 ,通讯使用 2379 端口
启动服务
[root@master(etcd)~]#systemctl restart etcd
master:一共4个服务,通讯使用 8080端口
[root@master(etcd)–]# systemctl restart kube-apiserver kube-controller-manager
kube-scheduler flanneld
minion1:一共4个服务
kubeproxy 监控听端口号是 10249 , kubelet 监听端口 10248、10250、10255 三个端口
[root@minion1 –]# systemctl restart flanneld kube-proxy kubelet docker
minion2:一共4个服务
[root@minion2 ~]# systemctl restart flanneld kube-proxy kubelet docker

点击前往作者CSDN博客