1、集群环境配置
使用kubeadm快速构建可用k8s集群虚拟机软件:VMware® Workstation 15 Pro虚拟机连接软件:xshell6镜像:cetnos7.iso(1708)操作系统:win10编写日期:2020年6月24
集群环境配置
虚拟机软件:
VMware® Workstation 15 Pro
虚拟机连接软件:
xshell6
镜像:
cetnos7.iso(1708)
操作系统:
win10
编写日期:2020年6月24
配置固定ip
-
设置网络连接方式
- 打开虚拟网络编辑器:点击导航栏 编辑(E) ->虚拟网络编辑器(N)。会弹出如下窗口
- 点击
更改设置(c)
进行更改设置
- 选择NAT模式,取消勾选
使用本地DHCP服务
设置子网IP
(任意一个c类网:xxx.xxx.xxx.0<xxx为0~255>
),子网掩码为255.255.255.0标准c类网络的子网掩码
。点击NAT设置(s)
。
- 设置
网关ip
原则上是上面设置中c类网络ip
将最后一个数字替换为1。实际上设置成0~255
之间的数字均可。
- 打开控制面板->网络和Internet->网络连接->VMware Network Adapter->Internet协议版本4(TCP/IPv4)
-
设置
ip地址
为上面所说的c类网络
末尾为任意一个不占用的网络地址- 验证
vm服务
是否开启,shift+esc
打开任务管理器点击服务
查看vm服务
是否开启
- 验证
-
验证网络是否可用:等待后面虚拟机安装完成后实际成测试网络连接是否ping通
配置适用于K8S集群
虚拟机原型
方便后面克隆调整
我的虚拟机配置:
master节点
:1核2线程4G内存
node节点
:1核2线程2G内存
当然可以根据需求适当增删配置,内存建议
4G
起步,不然后面配置完相关软件过程中产生OOM
很麻烦。
安装虚拟机
默认都会,不会另查安装教程
- 完成后查看
vm服务
是否开启
配置虚拟机网络配置
#进入网卡设置
cd /etc/sysconfig/network-scripts
#查看网卡,不同的操作环境可能会有多种网卡名称
ls
- 我们的网卡名称为
ifcfg-ens33
#升级为root用户
su
#输入命令,若不升级为root用户会出现无法修改ifcfg-ens33文件的情况
#编辑网卡设置,网卡名称
vi /etc/sysconfig/network-scripts/ifcfg-ens33
###此处为vim界面,改为如下设hi###
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPADDR=192.168.100.20
NETMASK=255.255.255.0
#此处网关需要与vmware的nat模式下的网关配置一致。
GATEWAY=192.168.100.1
DNS1=8.8.8.8
DNS2=8.8.4.4
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=02bf0478-640e-4ce2-a5cf-8ae9f684319d
DEVICE=ens33
ONBOOT=yes
- 其中
BOOTPROTO
默认为DHCP
需改成none
IPADDR
默认是不存在的,需要改成之前设置的c类网络
的不重复的子网ip
GATEWAY
为之前设置的网关
#重启网络并测试
systemctl restart network
#测试与百度的连接
ping www.baidu.com
使用xshell
连接配置好的服务器
- 只是用
xshell
连接好用点,其实也可以不用xshell
配置Linux环境
每个#
代表一个命令,建议逐条命令运行
#配置仓库
yum install -y epel-release
#下载相关软件
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget
#开启ip_vs
/usr/sbin/modprobe ip_vs
#关闭防火墙
systemctl stop firewalld
#关闭防火墙开机启动
systemctl disable firewalld
#设置默认转发策略
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
#^
iptables -P FORWARD ACCEPT
#关闭swap分区,如果开启了 swap 分区,kubelet 会启动失败
swapoff -a
#修改配置文件
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
#关闭selinux
setenforce 0
#修改配置文件
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
#加载内核模块
modprobe ip_vs_rr
#
modprobe br_netfilter
#优化内核参数
cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
#移动kubernetes.conf
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
#实现配置
sysctl -p /etc/sysctl.d/kubernetes.conf
# 调整系统 TimeZone
timedatectl set-timezone Asia/Shanghai
# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog
#
systemctl restart crond
#更新系统时间
ntpdate cn.pool.ntp.org
#关闭无关程序
systemctl stop postfix && systemctl disable postfix
#设置 rsyslogd 和 systemd journal
mkdir /var/log/journal # 持久化保存日志的目录
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化保存到磁盘
Storage=persistent
# 压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空间 10G
SystemMaxUse=10G
# 单日志文件最大 200M
SystemMaxFileSize=200M
# 日志保存时间 2 周
MaxRetentionSec=2week
# 不将日志转发到 syslog
ForwardToSyslog=no
EOF
#
systemctl restart systemd-journald
#配置yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak
#
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
#
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup
#
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#配置国内kubernetes源,可能需要实时更新,因为墙的关系
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF
#配置docker源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
#设置路由
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
#使路由生效
sysctl -p /etc/sysctl.d/k8s.conf
#清理缓存并更新配置
yum clean all && yum makecache && yum update -y #第一次需要比较久的时间
#
yum repolist # 查看正在使用yum源
#安装docker,因为docker19版本太新没有通过kubernet验证,故使用老一个版本的docker
yum install -y docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7
#设置开机启动
systemctl enable docker && systemctl start docker
#验证docker是否安装成功,若使用yum update的时候需要注意,它会自动升级到最新版本导致不兼容
docker --version
#安装kubelet、kubeadm、kubectl,这里的使1.18版本
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
#
systemctl enable kubelet
使用Kubeadm
快速创建集群
快速创建可用虚拟机
master
:配置:1核2线程3G
、ip:192.168.100.20
、name:master
node1
:配置:1核2线程2G
、ip:192.168.100.21
、name:node1
node2
:配置:1核2线程2G
、ip:192.168.100.22
、name:node2
tips
:记得保留pro,可根据实际情况适当调整配置,内存尽可能大点,防止运行程序时OOM
- 关闭原型机
pro
(不关闭没办法克隆)
-
克隆虚拟机
-
配置节点(在
vmWare
上配置,xshell在配置好网络之前连接不上
)-
master
:#设置主机名 hostnamectl set-hostname master # 将 master 替换为当前主机名 #升级为超级用户 su #设置ip,编辑完成之后重启网络 vi /etc/sysconfig/network-scripts/ifcfg-ens33 #重启网络服务 systemctl restart network #测试网络联通性 ping www.baidu.com #ping通后重启,然后我使用xshell连接重启后的服务器 reboot
- 对每个节点分别设置不同的
hostname
,重启后会显示修改好的hostname
,不重启也没事,只是看起来怪怪的。 - 分别修改
IPADDR
为已经设置好的IP地址
(小标题头有设置参考样本)
- 对每个节点分别设置不同的
-
node1
-
node2
-
node1
、node2
配置与master
节点配置类似。
-
使用Kubeadm
创建主节点
- 由于已经配置好网络,使用
xshell
连接服务器
-
配置master免密登录其他服务器(可选)
只是为了方便后面操作不需要输入密码,若安全需要或者不怕输密码麻烦可以配置完后删除密钥或者干脆不设置。
-
修改host文件
#修改hosts文件,其中ip为自己设置的ip cat >> /etc/hosts <<EOF 192.168.100.20 master 192.168.100.21 node1 192.168.100.22 node2 EOF
-
设置master无密码登录其他所有节点
#生成密钥 ssh-keygen -t rsa # ssh-copy-id root@master # ssh-copy-id root@node1 # ssh-copy-id root@node2
-
-
配置
Kubeadm
#查看kubelet安装了那些文件 rpm -ql kubelet
#修改/etc/sysconfig/kubelet sed -i "s/KUBELET_EXTRA_ARGS=/KUBELET_EXTRA_ARGS=\"--fail-swap-on=false\"/" /etc/sysconfig/kubelet #查看是否修改 cat /etc/sysconfig/kubelet
#修改kubernetes所需的镜像源为阿里源 # 导出配置文件 kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml #查看是否生成kubeadm.yml ls
#修改配置 #打开kubeadm.yml vi kubeadm.yml #设置配置kubeadm.yml
###kubead.yml文件### apiVersion: kubeadm.k8s.io/v1beta2 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: #修改为主节点IP advertiseAddress: 192.168.100.20 bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock name: master taints: - effect: NoSchedule key: node-role.kubernetes.io/master --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes # ...? controlPlaneEndpoint: "" controllerManager: {} dns: type: CoreDNS etcd: local: dataDir: /var/lib/etcd # imageRepository: k8s.gcr.io,国内无法访问修改为阿里云 imageRepository: registry.aliyuncs.com/google_containers kind: ClusterConfiguration kubernetesVersion: v1.18.0 networking: dnsDomain: cluster.local # 配置成Flannel的默认网段 podSubnet: "10.244.0.0/16" serviceSubnet: 10.96.0.0/12 scheduler: {} --- #开启IPVS模式 apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration featureGates: SupportIPVSProxyMode: true mode: ipvs
# 查看所需镜像列表 kubeadm config images list --config kubeadm.yml #拉取所需镜像 kubeadm config images pull --config kubeadm.yml
-
初始化主节点
#初始化主节点,在后续执行加入节点时自动分发证书文件,kubeadm-init.log 用以输出日志 kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log
#按照安装命令执行 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
work节点
加入集群
-
加入集群
#在子节点上运行命令,kubeadm init的时候给了加入命令,上述额外命令也讲了,并不是所有命令都一样,需要输入自己配置的指令 kubeadm join 192.168.100.20:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:06a07a48872697d62761b6472cb9890fd2f03cf247bc93a5ee3f62a1887eebd7
#在主节点上查看组件是否安装成功,因为没有配置好网络,所以node的状态为NotReady kubectl get cs,nodes
为K8S
集群配置网络
K8S
集群有很多配置网络的插件,比如Flannel
、Calico
等,只要这些插件实现了CNI
接口就能够为K8S
提供网络服务大型企业用
Calico
的较多,单我们小型集群采用Flannel
,之后会介绍这些插件之间的区别
-
查看网络状态
#查看pod运行状态 kubectl get pod -n kube-system -o wide
- 发现负责
dns
转发的pod没有正常运行,故之前网络配置没有完成
- 发现负责
-
配置
Flannel
网络-
下载
Flannel
配置文件#下载flannel配置文件 curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f kube-flannel.yml #查看下载是否完成 ls
-
因为我们的系统内存在多个网卡,所以参考
flannel issues 39701
修改kube-flannel.yml
文件#flanneld启动参数加上–iface=<iface-name> #编辑kube-flannel.yml文件 vi kube-flannel.yml #可以在vim中使用`/containers`快速查找到,然后再args参数后面添加启动参数,由于我们配置过的网卡为ifcfg-ens33,所以我们的网卡名称为ens33
#更新配置并启动`flannel` kubectl apply -f kube-flannel.yml
-
若无报错直接跳过错误排查
-
错误排查,发现一个奇怪的报错,报错的主要意思是发现一个不符合逻辑的制表键
tab
#处理error #1、查看第59行发生了啥 vi kube-flannel.yml #输入命令:set number
-
发现不是我们操作失误,是原来
kubenets-flannel.yml
的文件,而且后面格式也一样,那么我们就不管了,不是我们的问题,而且服务已经启动 -
:set number
是为了方便截图先用了之后再打上去的,正常拉到底是看不到这个的 -
后续启动发现启动不了,仅启动了部分
pod
-
仔细研究后发现如下图
-
这里不是
tab
,而是8个空格
,虽然长得一模一样,但是用tab
会报错,重试了一下8个空格
没有报错,至于为什么显示第59行有非法tab
后续在研究 -
修改完成之后重新启动服务器
#删除之前不合理的部署 kubectl delete -f kube-flannel.yml #重新部署 kubectl apply -f kube-flannel.yml
#重新查看网络服务是否启动成功,正常来说需要点时间 watch kubectl get pod --all-namespaces -o wide #其实命令`kubectl get pod -n kube-system -o wide`效果类似,只是添加了watch相当于实时监控(<ctrl+C>退出),我采用了下面这个,如果不成功等待一会儿再试试 kubectl get pod -n kube-system -o wide
-
-
成功启动网络服务
#查看node kubectl get nodes
- 节点状态变成
Ready
-
常用命令
#######额外命令#######
#加入集群
kubeadm join <ip:port> --token <token> --discovery-token-ca-cert-hash <cert-hash>
#查看token
kubeadm token list
#生成新的token
kubeadm token create
#查看--discovery-token-ca-cert-hash
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
#验证主节点是否生成成功
kubectl get node
#重置节点,在子节点上运行<在重置节点前千万不要删除它的配置文件,不然没办法完全删除>
kubeadm reset
#删除节点,在主节点上运行
kubeadm delete nodes <NAME||ip>
更多推荐
所有评论(0)