集群环境配置

虚拟机软件:VMware® Workstation 15 Pro

虚拟机连接软件:xshell6

镜像:cetnos7.iso(1708)

操作系统:win10

编写日期:2020年6月24

配置固定ip

  • 设置网络连接方式

    设置虚拟网络编辑器
    • 打开虚拟网络编辑器:点击导航栏 编辑(E) ->虚拟网络编辑器(N)。会弹出如下窗口
    image-20200624101632366
    • 点击更改设置(c)进行更改设置
    image-20200624102200002
    • 选择NAT模式,取消勾选使用本地DHCP服务 设置子网IP(任意一个c类网:xxx.xxx.xxx.0<xxx为0~255>),子网掩码为255.255.255.0标准c类网络的子网掩码。点击NAT设置(s)
    image-20200624102752277
    • 设置网关ip原则上是上面设置中c类网络ip将最后一个数字替换为1。实际上设置成0~255之间的数字均可。
    image-20200624103634394
    • 打开控制面板->网络和Internet->网络连接->VMware Network Adapter->Internet协议版本4(TCP/IPv4)
  • 设置ip地址为上面所说的c类网络末尾为任意一个不占用的网络地址

    image-20200624104224680
    • 验证vm服务是否开启,shift+esc打开任务管理器点击服务查看vm服务是否开启
  • 验证网络是否可用:等待后面虚拟机安装完成后实际成测试网络连接是否ping通

配置适用于K8S集群虚拟机原型

方便后面克隆调整

我的虚拟机配置:

master节点1核2线程4G内存

node节点:1核2线程2G内存

当然可以根据需求适当增删配置,内存建议4G起步,不然后面配置完相关软件过程中产生OOM很麻烦。

安装虚拟机

默认都会,不会另查安装教程

  • 完成后查看vm服务是否开启
image-20200624110130833

配置虚拟机网络配置

#进入网卡设置
cd /etc/sysconfig/network-scripts
#查看网卡,不同的操作环境可能会有多种网卡名称
ls
image-20200624111136263
  • 我们的网卡名称为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
image-20200624112925895

使用xshell连接配置好的服务器

image-20200624151301115
  • 只是用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线程3Gip:192.168.100.20name:master

node1配置:1核2线程2Gip:192.168.100.21name:node1

node2配置:1核2线程2Gip:192.168.100.22name:node2

tips:记得保留pro,可根据实际情况适当调整配置,内存尽可能大点,防止运行程序时OOM

  • 关闭原型机pro(不关闭没办法克隆)
image-20200624163041831
  • 克隆虚拟机

    image-20200624162835621
image-20200624163231185
  • 配置节点(在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
      
      image-20200624165048455 image-20200624165137776
      • 对每个节点分别设置不同的hostname,重启后会显示修改好的hostname,不重启也没事,只是看起来怪怪的。
      • 分别修改IPADDR为已经设置好的IP地址(小标题头有设置参考样本)
    • node1

    • node2

    • node1node2配置与master节点配置类似。

使用Kubeadm创建主节点

  • 由于已经配置好网络,使用xshell连接服务器
image-20200624170754696
  • 配置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
    
    image-20200624200329839
    #修改/etc/sysconfig/kubelet
    sed -i "s/KUBELET_EXTRA_ARGS=/KUBELET_EXTRA_ARGS=\"--fail-swap-on=false\"/" /etc/sysconfig/kubelet
    #查看是否修改
    cat /etc/sysconfig/kubelet
    
    image-20200624200053451
    #修改kubernetes所需的镜像源为阿里源
    # 导出配置文件
    kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml
    #查看是否生成kubeadm.yml
    ls
    
    image-20200625193115597
    #修改配置
    #打开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
    
    image-20200624203327954
  • 初始化主节点

    image-20200624201322095
    #初始化主节点,在后续执行加入节点时自动分发证书文件,kubeadm-init.log 用以输出日志
    kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log
    
    image-20200625192133819
    #按照安装命令执行
    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 
    
    image-20200625193810168
    #在主节点上查看组件是否安装成功,因为没有配置好网络,所以node的状态为NotReady
    kubectl get cs,nodes
    
    image-20200625194527121

K8S集群配置网络

K8S集群有很多配置网络的插件,比如FlannelCalico等,只要这些插件实现了CNI接口就能够为K8S提供网络服务

大型企业用Calico的较多,单我们小型集群采用Flannel,之后会介绍这些插件之间的区别

  • 查看网络状态

    #查看pod运行状态
    kubectl get pod -n kube-system -o wide
    
    image-20200625195438071
    • 发现负责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
      
      image-20200625195835985
    • 因为我们的系统内存在多个网卡,所以参考flannel issues 39701修改kube-flannel.yml文件

      #flanneld启动参数加上–iface=<iface-name>
      #编辑kube-flannel.yml文件
      vi kube-flannel.yml
      #可以在vim中使用`/containers`快速查找到,然后再args参数后面添加启动参数,由于我们配置过的网卡为ifcfg-ens33,所以我们的网卡名称为ens33
      
      image-20200625200554088
      #更新配置并启动`flannel`
      kubectl apply -f  kube-flannel.yml
      
      image-20200625201349836
      • 若无报错直接跳过错误排查

      • 错误排查,发现一个奇怪的报错,报错的主要意思是发现一个不符合逻辑的制表键tab

        #处理error
        #1、查看第59行发生了啥
        vi kube-flannel.yml
        #输入命令:set number
        
        image-20200625201742335
      • 发现不是我们操作失误,是原来kubenets-flannel.yml的文件,而且后面格式也一样,那么我们就不管了,不是我们的问题,而且服务已经启动

      • :set number是为了方便截图先用了之后再打上去的,正常拉到底是看不到这个的

      • 后续启动发现启动不了,仅启动了部分pod

      • 仔细研究后发现如下图
        image-20200625203117841

      • 这里不是tab,而是8个空格,虽然长得一模一样,但是用tab会报错,重试了一下8个空格没有报错,至于为什么显示第59行有非法tab后续在研究

      • 修改完成之后重新启动服务器

      #删除之前不合理的部署
      kubectl delete -f kube-flannel.yml
      #重新部署
      kubectl apply -f kube-flannel.yml
      
      image-20200625203528751
      #重新查看网络服务是否启动成功,正常来说需要点时间
      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
      
      image-20200625203941349
    • 成功启动网络服务

    #查看node
    kubectl get nodes
    
    image-20200625204149693
    • 节点状态变成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> 
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐