前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用kubeadm在腾讯云上搭建Kubernetes集群

使用kubeadm在腾讯云上搭建Kubernetes集群

原创
作者头像
pengsiryan
修改2020-03-20 10:13:30
2.2K0
修改2020-03-20 10:13:30
举报

一、安装前准备

资源准备&环境准备

1.北京地区创建3台节点,一台作为master,其余两台作为work节点。

系统镜像为腾讯云服务器公共镜像 CentOS 7.2系统

代码语言:javascript
复制
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

代码语言:javascript
复制
 #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.关闭交换分区

代码语言:javascript
复制
echo "vm.swappiness = 0">> /etc/sysctl.conf
sysctl -p 
swapoff -a #实时动态关闭

4.配置时间同步

代码语言:javascript
复制
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可以表示允许所有的网络来同步时间

代码语言:javascript
复制
[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强同步

代码语言:javascript
复制
[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 的链

代码语言:javascript
复制
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模块,脚本如下

代码语言:javascript
复制
#!/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

二、安装docker

1 安装docker,需要在三台服务器上全部进行操作

代码语言:javascript
复制
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,用于解决镜像拉取过慢的问题。

代码语言:javascript
复制
yum install squid  #在境外服务器内安装squid
vi  /etc/squid/squid.conf

最底部增加 如下
http_access allow all
然后 注释掉
http_access deny all
#注意默认端口是3128,建议更改为自定义端口,例如28809之类

service squid start

netstat -ntl  #如果你自定义的端口存在那么证明服务启动成功
代码语言:javascript
复制
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

代码语言:javascript
复制
systemctl daemon-reload && systemctl start docker   #加载新的unit 配置文件&& 启动docker
systemctl enable docker #将docker加入到开机启动
docker version  #查看docker启动情况 和版本信息

4 查看docker自定义信息是否生效

代码语言:javascript
复制
docker info
#出现HTTPS PROXY和NO PROXY字段且配置的IP地址和端口和你自定义的一样,表示添加配置生效
iptables -vnL 
#出现 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) 表示添加配置生效 

测试生效

三、安装kubernetes

1.配置k8s资源的下载地址

代码语言:javascript
复制
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

代码语言:javascript
复制
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet.service #开机启动

3. 在master和node上设置忽略swap启用的状态

代码语言:javascript
复制
echo 'KUBELET_EXTRA_ARGS="--fail-swap-on=false"' > /etc/sysconfig/kubelet && 
cat /etc/sysconfig/kubelet

4. 在master上做初始化操作

4.1 查看默认配置信息

代码语言:javascript
复制
kubeadm config print init-defaults

pod之间相互通信插件默认网段

代码语言:javascript
复制
flannel:10.244.0.0/16 我们使用flannel
calico:192.168.0.0/16

4.2.下载镜像

代码语言:javascript
复制
[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 初始化

代码语言:javascript
复制
执行
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默认的镜像仓库

代码语言:javascript
复制
初始化成功后会有如下信息,用于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网络

代码语言:javascript
复制
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添加到集群内

代码语言:javascript
复制
在node上执行如下命令
 kubeadm join 172.16.20.16:6443 --token woza6m.hipt2dyeulpkjmqd \
    --discovery-token-ca-cert-hash sha256:0715b940114a1dcba86724ab81d6dde724a85c6f7e8ccd9733d1111548c3cc0c

6.这时在node上是无法使用 kubectl命令的,在master 复制配置文件到node上即可

代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、安装前准备
    • 资源准备&环境准备
    • 二、安装docker
    • 三、安装kubernetes
    相关产品与服务
    容器镜像服务
    容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档