1.北京地区创建3台节点,一台作为master,其余两台作为work节点。
系统镜像为腾讯云服务器公共镜像 CentOS 7.2系统
hostnamectl set-hostname master #设置主机名
echo -e "172.16.20.16 master \n172.16.20.30 node1 \n172.16.20.4 node2" >> /etc/hosts #并将主机名同步到每台主机
2.关闭seleniux、iptables、firewalld和NetworkManage
#getenforce 可以查看seLinux状态
sed -i '/^SELINUX/s/enforcing/disabled/' /etc/selinux/config
systemctl stop NetworkManager
systemctl disable NetworkManager
systemctl stop firewalld
systemctl disable firewalld
iptables -F
3.关闭交换分区
echo "vm.swappiness = 0">> /etc/sysctl.conf
sysctl -p
swapoff -a #实时动态关闭
4.配置时间同步
yum -y install chrony
systemctl start chronyd
systemctl enable chronyd
systemctl status chronyd
在node1、2上编辑/etc/chrony.conf,使用master节点作为时间服务器,并重启chronyd
注: # Allow NTP client access from local network.
allow 172.16.0.0/16 #允许作为客户端同步的网段
#allow 0.0.0.0/0可以表示允许所有的网络来同步时间
[root@node1 ~]# systemctl restart chronyd
[root@node1 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^? master 0 6 0 - +0ns[ +0ns] +/- 0ns
[root@node1 ~]#
测试,在work节点上更改时间,然后使用nptdate强同步
[root@node1 ~]# date
Tue Mar 17 11:47:34 CST 2020
[root@node1 ~]# date -s 20170501
Mon May 1 00:00:00 CST 2017
[root@node1 ~]# date
Mon May 1 00:00:03 CST 2017
[root@node1 ~]# ntpdate maste
17 Mar 11:49:01 ntpdate[10871]: step time server 172.16.20.16 offset 90848928.970377 sec
[root@node1 ~]# date
Tue Mar 17 11:49:03 CST 2020
[root@node1 ~]#
5.修改内核参数,将桥接的IPV4流量传递到iptables 的链
vim /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
modprobe br_netfilter #执行该命令 如果不执行就会在应用k8s.conf时出现加载错误
sysctl -p
sysctl --system
sysctl -a | grep bridge
PS:如果不执行modprobe br_netfilter,直接sysctl -p,会报错,如下:
6.如果采用ipvs转发,需要加载ipvs模块,脚本如下
#!/bin/sh
ipvs_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs"
for mod in $(ls $ipvs_dir | grep -o "[^.ko]*")
do
modinfo -F filename $mod &> /dev/null
if [ $? -eq 0 ];then
modprobe $mod
fi
done
lsmod |grep ip_vs
1 安装docker,需要在三台服务器上全部进行操作
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #配置docker下载的地址
yum list docker-ce --showduplicates|sort -r #展示版本列表
yum install docker-ce -y
2 配置docker启动文件
这里找一台境外的服务器安装下squid,用于解决镜像拉取过慢的问题。
yum install squid #在境外服务器内安装squid
vi /etc/squid/squid.conf
最底部增加 如下
http_access allow all
然后 注释掉
http_access deny all
#注意默认端口是3128,建议更改为自定义端口,例如28809之类
service squid start
netstat -ntl #如果你自定义的端口存在那么证明服务启动成功
vim /usr/lib/systemd/system/docker.service
#如果通过k8s.gcr.io镜像仓库获取kubernetes系统相关镜像,需要在docker启动文件(/usr/lib/systemd/system/docker.service)中配置 Environment 变量,为其定义 HTTPS_PROXY
格式如下
#格式:Environment="HTTPS_PROXY=PROTOCOL://HOST:PORT" (添加在21、22行)
Environment="HTTPS_PROXY=http://你的国际地域服务器IP地址:squid开放的端口"
Environment="NO_PROXY=127.0.0.0/8,10.0.0.0/8" #不用代理的为本机ip
#iptables中FORWARD链是关闭的,需要在dockers启动后开启,在启动文件 ExecStart 下添加一行(第14行)
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
使用scp快速分发配置文件到其它机器,也可以使用ansible
scp /usr/lib/systemd/system/docker.service node1:/usr/lib/systemd/system/docker.service
scp /usr/lib/systemd/system/docker.service node2:/usr/lib/systemd/system/docker.service
3 启动docker
systemctl daemon-reload && systemctl start docker #加载新的unit 配置文件&& 启动docker
systemctl enable docker #将docker加入到开机启动
docker version #查看docker启动情况 和版本信息
4 查看docker自定义信息是否生效
docker info
#出现HTTPS PROXY和NO PROXY字段且配置的IP地址和端口和你自定义的一样,表示添加配置生效
iptables -vnL
#出现 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) 表示添加配置生效
测试生效
1.配置k8s资源的下载地址
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum repolist
2.master及work节点上安装 kubelet kubeadm kubectl
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet.service #开机启动
3. 在master和node上设置忽略swap启用的状态
echo 'KUBELET_EXTRA_ARGS="--fail-swap-on=false"' > /etc/sysconfig/kubelet &&
cat /etc/sysconfig/kubelet
4. 在master上做初始化操作
4.1 查看默认配置信息
kubeadm config print init-defaults
pod之间相互通信插件默认网段
flannel:10.244.0.0/16 我们使用flannel
calico:192.168.0.0/16
4.2.下载镜像
[root@node1 ~]# kubeadm config images list 查看需要哪些镜像
W0317 16:54:56.927520 21679 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0317 16:54:56.927569 21679 validation.go:28] Cannot validate kubelet config - no validator is available
k8s.gcr.io/kube-apiserver:v1.17.4
k8s.gcr.io/kube-controller-manager:v1.17.4
k8s.gcr.io/kube-scheduler:v1.17.4
k8s.gcr.io/kube-proxy:v1.17.4
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
4.3 初始化
执行
kubeadm init --kubernetes-version=v1.15.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
#ignore-preflight-errors参数如果是物理机,内存比较大可以不指定此参数
#这个初始化是采用k8s默认的镜像仓库
初始化成功后会有如下信息,用于node添加到集群内。
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 172.16.20.16:6443 --token woza6m.hipt2dyeulpkjmqd \
--discovery-token-ca-cert-hash sha256:0715b940114a1dcba86724ab81d6dde724a85c6f7e8ccd9733d1111548c3cc0c
[root@master ~]#
4.4 在master上使用kubectl管理以及初始化flannel网络
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#初始化flannel网络
#git地址:https://github.com/coreos/flannel ,以下命令是在git上的Deploying flannel manually 找到
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
5. 将node添加到集群内
在node上执行如下命令
kubeadm join 172.16.20.16:6443 --token woza6m.hipt2dyeulpkjmqd \
--discovery-token-ca-cert-hash sha256:0715b940114a1dcba86724ab81d6dde724a85c6f7e8ccd9733d1111548c3cc0c
6.这时在node上是无法使用 kubectl命令的,在master 复制配置文件到node上即可
scp /root/.kube/config node1:/root/.kube/config
scp /root/.kube/config node2:/root/.kube/config
在node上执行命令
[root@node1 .kube]# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master Ready master 6h40m v1.17.4 172.16.20.16 <none> CentOS Linux 7 (Core) 3.10.0-514.26.2.el7.x86_64 docker://19.3.8
node1 Ready <none> 15m v1.17.4 172.16.20.30 <none> CentOS Linux 7 (Core) 3.10.0-514.26.2.el7.x86_64 docker://19.3.8
node2 Ready <none> 13m v1.17.4 172.16.20.4 <none> CentOS Linux 7 (Core) 3.10.0-957.21.3.el7.x86_64 docker://19.3.8
在master上查看下pod运行状态
[root@master .kube]# kubectl get pod --all-namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system coredns-6955765f44-6nlrt 1/1 Running 0 6h41m 10.244.0.2 master <none> <none>
kube-system coredns-6955765f44-fdkvs 1/1 Running 0 6h41m 10.244.0.3 master <none> <none>
kube-system etcd-master 1/1 Running 0 6h41m 172.16.20.16 master <none> <none>
kube-system kube-apiserver-master 1/1 Running 0 6h41m 172.16.20.16 master <none> <none>
kube-system kube-controller-manager-master 1/1 Running 0 6h41m 172.16.20.16 master <none> <none>
kube-system kube-flannel-ds-amd64-9xkfp 1/1 Running 2 17m 172.16.20.30 node1 <none> <none>
kube-system kube-flannel-ds-amd64-hstxv 1/1 Running 2 14m 172.16.20.4 node2 <none> <none>
kube-system kube-flannel-ds-amd64-mg2wm 1/1 Running 0 21m 172.16.20.16 master <none> <none>
kube-system kube-proxy-2tt5m 1/1 Running 0 14m 172.16.20.4 node2 <none> <none>
kube-system kube-proxy-8v49l 1/1 Running 0 6h41m 172.16.20.16 master <none> <none>
kube-system kube-proxy-msgb9 1/1 Running 0 17m 172.16.20.30 node1 <none> <none>
kube-system kube-scheduler-master 1/1 Running 0 6h41m 172.16.20.16 master <none> <none>
[root@master .kube]#
至此已经完成了测试k8s的搭建,接下来即可进行各种组件的测试。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。