文章目录
文档说明
本文将使用kubeadm安装k8s1.16.9版本,并且在k8s集群中安装kubesphere2.1.1。
官方文档中明确说明了如果要完全安装kubesphere,集群机器配置至少是8c16g,而最小化安装机器配置最少为2g内存,首次安装建议选择最小化安装,跟随文档,也会介绍如何定制安装。
准备工作
本文所有操作是在windows10系统下进行的,还需如下工具:
K8S环境准备
创建并启动4个虚拟机
在任意目录中创建文件,命名为:Vagrantfile
,使用文本编辑工具添加如下内容:
Vagrant.configure("2") do |config|
(1..4).each do |i|
config.vm.define "k8s-node#{i}" do |node|
# 设置虚拟机的Box
node.vm.box = "centos/7"
# 设置虚拟机的主机名
node.vm.hostname="k8s-node#{i}"
# 设置虚拟机的IP
node.vm.network "private_network", ip: "192.168.56.#{99+i}", netmask: "255.255.255.0"
# 设置主机与虚拟机的共享目录
# node.vm.synced_folder "~/Documents/vagrant/share", "/home/vagrant/share"
# VirtaulBox相关配置
node.vm.provider "virtualbox" do |v|
# 设置虚拟机的名称
v.name = "k8s-node#{i}"
# 设置虚拟机的内存大小
v.memory = 4096
# 设置虚拟机的CPU个数
v.cpus = 4
end
end
end
end
说明:
- 默认每台虚机CPU:4核 内存:4GB
- 创建4台虚拟机,名称分别为: k8s-node1、k8s-node2、k8s-node3、k8s-node4
- 4台虚拟机的宿主IP分别为:192.168.56.100、192.168.56.101、192.168.56.102、192.168.56.103
#在Vagrantfile文件所在目录中执行如下命令:
vagrant up
注:如果安装很慢,可以先下载vagrant box来解决,方法如下:
- 进入vagrant官网 https://www.vagrantup.com/
- 点击findbox【寻找box】,进入有很多box的列表 https://app.vagrantup.com/boxes/search
- Download
- 下载的文件放在和Vagrantfile文件同一目录下
- 执行命令,加载镜像:
vagrant box add centos/7 CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box
- 重新执行:
vagrant up
开启root密码访问权限
设置访问权限
#进入到vagrantfile文件所在目录
#k8s-node1为虚拟机的名称
vagrant ssh k8s-node1
#切换root账户
su root
#输入密码(密码是 vagrant)
#编辑文件
vi /etc/ssh/sshd_config
修改 PasswordAuthentication yes
#重启服务
service sshd restart
#退出
exit
exit
其它两个节点也是按照上述方法设置访问权限
ssh客户端连接节点
Windows10推荐使用xshell
,MacOS推荐使用iterm2
SSH客户端工具。
连接到三台虚机之后,命令ip addr
查看eth0 ip,发现每个节点的IP相同,是因为虚拟默认的网卡连接方式是(网络地址转换NAT),需要更改。
设置虚拟机的网络环境
- 在VirtualBox中关闭三个节点的电源。
- 在VirtualBox菜单,
管理
-全局设定
-网络
,创建一个NatNetwork。 - 选中每台虚机,
设置
-网络
-网卡1
,连接方式:选择NAT网络
,界面名称:NatNetwork
,高级:Mac地址:刷新。 - 同样其它节点也做同样的设置。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AgdrwzRx-1608683529281)(evernotecid://E724F631-6C1C-440D-962A-A702734E8171/appyinxiangcom/2609410/ENResource/p82)]
# 检测网络环境是否设置好
ip route show #检查是否用的相同的网卡eth0
ip addr #此时观察每个节点的IP是否是不同的
ping [ip] #每台虚拟机都互PING下
角色 | IP地址 | 主机名 | docker版本 | 系统 |
---|---|---|---|---|
master | 10.0.2.20 | k8s-node1 | 18.09.9 | CentOS7.x |
node1 | 10.0.2.21 | k8s-node2 | 18.09.9 | CentOS7.x |
node2 | 10.0.2.22 | k8s-node3 | 18.09.9 | CentOS7.x |
node3 | 10.0.2.23 | nfs-node | 18.09.9 | CentOS7.x |
以上主机名前缀为k8s的虚机将配置k8s集群,nfs-node仅作为NFS服务节点。
为每个节点配置host信息
cat >> /etc/hosts <<EOF
10.0.2.20 k8s-node1
10.0.2.21 k8s-node2
10.0.2.22 k8s-node3
10.0.2.23 nfs-node
EOF
设置linux环境
如下K8S三个节点都要配置。
关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
关闭selinux
#临时修改
setenforce 0
#永久修改,重启服务器后生效
sed -i '7s/enforcing/disabled/' /etc/selinux/config
#查看SELinux状态
sestatus
创建
/etc/sysctl.d/k8s.conf
文件,添加如下内容
#向文件中写入以下内容
cat >/etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
#执行以下命令生效
modprobe br_netfilter && sysctl -p /etc/sysctl.d/k8s.conf
安装ipvs
脚本创建了的/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。
#向文件中写入以下内容
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
#修改权限以及查看是否已经正确加载所需的内核模块
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
#output
nf_conntrack_ipv4 15053 0
nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
ip_vs_sh 12688 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 0
ip_vs 145497 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 133095 2 ip_vs,nf_conntrack_ipv4
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
安装ipset和ipvsadm(便于查看 ipvs 的代理规则)
yum -y install ipset ipvsadm
同步服务器时间
#安装chrony
yum -y install chrony
#修改同步服务器地址为阿里云
sed -i.bak '3,6d' /etc/chrony.conf && sed -i '3cserver ntp1.aliyun.com iburst' \
/etc/chrony.conf
#启动chronyd及加入开机自启
systemctl start chronyd && systemctl enable chronyd
#查看同步结果
chronyc sources
#output
210 Number of sources = 1 MS Name/IP address Stratum Poll Reach LastRx Last sample ===============================================================
^* 120.25.115.20 2 6 37 13 +194us[+6131us] +/- 33ms
关闭swap
#临时关闭
swapoff -a
#永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
通过free -m
命令查看
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VhdYuoPl-1608683529286)(evernotecid://E724F631-6C1C-440D-962A-A702734E8171/appyinxiangcom/2609410/ENResource/p84)]
swappiness 参数调整,修改/etc/sysctl.d/k8s.conf添加下面一行
cat >>/etc/sysctl.d/k8s.conf <<EOF
vm.swappiness=0
EOF
#使配置生效
sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
安装docker
卸载之前的docker
#如果是重新安装docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
添加阿里云yum源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
查看可用版本
yum list docker-ce --showduplicates|sort -r
安装docker18.09.9
请不要安装最新版本的docker,可能会发生不可预料的结果
yum -y install docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9
启动docker并设置开机自启
systemctl enable docker && systemctl start docker
配置阿里docker镜像加速
阿里镜像加速 自行申请或使用如下地址。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://cbcadaae.mirror.aliyuncs.com"]
}
EOF
配置完后重启docker
sudo systemctl restart docker
查看加速
docker info
查看docker版本
docker version
#output
Client: Version: 18.09.9
API version: 1.39
Go version: go1.11.13
Git commit: 039a7df9ba
Built: Wed Sep 4 16:51:21 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine: Version: 18.09.9
API version: 1.39 (minimum version 1.12)
Go version: go1.11.13
Git commit: 039a7df
Built: Wed Sep 4 16:22:32 2019
OS/Arch: linux/amd64
Experimental: false
修改docker Cgroup Driver为systemd
#修改docker Cgroup Driver为systemd
#将/usr/lib/systemd/system/docker.service文件中的这一行 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
#修改为 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
#如果不修改,在添加 worker 节点时可能会碰到如下错误 [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
#使用如下命令修改
sed -i.bak "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service
#重启docker
systemctl daemon-reload && systemctl restart docker
安装kubeadm
科学上网
cat >/etc/yum.repos.d/kubernetes.repo<<EOF
[kubernetes]
name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
使用阿里云yum源
cat >/etc/yum.repos.d/kubernetes.repo <<EOF
[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
安装 kubeadm、kubelet、kubectl(阿里云yum源会随官方更新最新版,因此指定版本)
#安装1.16.9版本
yum -y install kubelet-1.16.9 kubeadm-1.16.9 kubectl-1.16.9
#查看版本
kubeadm version
#output
kubeadm version: &version.Info{
Major:"1", Minor:"16", GitVersion:"v1.16.9", GitCommit:"a17149e1a189050796ced469dbd78d380f2ed5ef", GitTreeState:"clean", BuildDate:"2020-04-16T11:42:30Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
设置kubelet开机自启
systemctl enable kubelet
设置k8s命令自动补全
yum -y install bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
至此,基本环境安装完成
建议:在virtualBox中为每台虚机生成一个备份(系统快照)
初始化K8S集群
kubeadm初始化
kubeadm init \
#master节点IP
--apiserver-advertise-address=10.0.2.20 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.16.9 \
--service-cidr=10.96.0.0/16 \
#k8s容器组所在的网段
--pod-network-cidr=10.244.0.0/16
执行完成后,不要关掉窗口!!!
拷贝kubeconfig文件
#此处代码为上一步骤执行成功后返回的
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
将节点加入到集群中
kubeadm join 10.0.2.20:6443 --token cd2n8p.1cjz9slln7sb8ypb \
--discovery-token-ca-cert-hash sha256:07860c45c429751f26d737ed29d6d87f3cdfd4131cd7627675de63ad05637a22
# 此处的token是初始化成功后返回的 (你的和我的不一样)
# 注意上述命令需要在规定时间(20小时)内完成,否则token失效
生成新的token
如果长时间没有将节点加入集群,token会失效,可以用如下方法重新生成token。
#默认有效期24小时,若想久一些可以结合--ttl参数,设为0则用不过期
kubeadm token create --print-join-command
#output
kubeadm join 10.0.2.20:6443 --token pdas2m.fkgn8q7mz5u96jm6 --discovery-token-ca-cert-hash sha256:6fd9b1bf2d593d2d4f550cd9f1f596865f117fef462db42860228311c2712b8b
#查看token
kubeadm token list
master节点查看node,发现状态都是NotReady,因为还没有安装网络插件。
安装flannel网络插件
kube-flannel.yml
---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: psp.flannel.unprivileged
annotations:
seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/defa