一 系统环境说明
- 系统版本:CentOS 7.8
- 内核版本:3.10.0-1127 后续看是否有必要升级到 4.4.218-1
- kubernetes 版本:1.19.3
- docker版本:19.03.11
二 安装前的准备
(1)配置本地解析
node和master都'需要做'
原因
节点的 hostname 必须使用标准的 DNS 命名,另外千万不用使用默认的
localhost
的 hostname,会导致各种错误出现的。在 Kubernetes 项目里,机器的名字以及一切存储在 Etcd 中的 API 对象,都必须使用标准的 DNS 命名(RFC 1123)
(2)禁用防火墙和SELinux
node和master'都需要做'
禁用防火墙
$ systemctl stop firewalld $ systemctl disable firewalld
禁用SELINUX
setenforce 0 cat /etc/selinux/config SELINUX=disabled '或者'sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
(3)由于开启内核 ipv4 转发需要加载 br_netfilter 模块,所以加载下该模块
modprobe br_netfilter -->'node和master'
(4)配置内核参数
node和master'都需要'
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system '或者' sysctl -p /etc/sysctl.d/k8s.conf
'备注': net.ipv4.ip_forward = 1 --> 不确定的话也可以'添加到'里面
(5)安装ipvs
网络'采用ipvs','不采用iptables' --> 'node和master'
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
脚本创建了的
/etc/sysconfig/modules/ipvs.modules
文件,保证在节点重启后能自动加载所需模块。使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4
命令查看是否已经正确加载所需的内核模块
安装相应的工具包
接下来还需要确保各个节点上已经安装了 ipset 软件包
$ yum install ipset -y
为了便于查看 ipvs 的代理规则,最好安装一下管理工具 ipvsadm
$ yum install ipvsadm -y
(6)安装容器运行时
'master和node'都需要安装 --> '注意版本的一致性'
(7)时间同步
'master和node'都安装
yum install chrony -y
systemctl enable chronyd
systemctl start chronyd
'检测'
chronyc sources '或者' chronyc sources -v
---------------- 'master配置(server)' ----------------
vim /etc/chrony.conf
server ntp1.aliyun.com iburst
'其它sever删除,只留下阿里云'
allow 172.25.2.0/24
'允许其此网段的来同步自己的时间'
---------------- 'node配置(client)' ----------------
vim /etc/chrony.conf
'删除所有的server,将master作为server'
server 172.25.2.200 iburst
① master节点
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
国外是'Google源' --> '被禁止'
安装指定版本的kubernetes组件
yum install -y kubelet-1.19.3 kubeadm-1.19.3 kubectl-1.19.3 --disableexcludes=kubernetes
-disableexcludes '禁掉除了'kubernetes之外的别的仓库
备注:'kubeadm master也需要安装kubelet' --> '有几个static pod'
设置kubelet开机立即启动
systemctl enable --now kubelet
② node节点
'安装docker'
'配置国内源' --> '只安装kubelet'
yum install -y kubelet-1.19.3
'开机启动'
systemctl enable --now kubelet
(9)初始化集群
(1) '导出默认的初始化配置:' --> '便于修改' --> '只在master上做'
kubeadm config print init-defaults > kubeadm.yaml
然后根据我们自己的'需求修改'配置
1)imageRepository 的值 --> '如果没有配置代理,国内无法拉取'
2)kube-proxy 的模式为 ipvs --> '节点不支持ipvs会自动降级成iptables'
3)我们这里是准备安装 'flannel 网络插件'的,需要将 networking.podSubnet 设置为10.244.0.0/16
说明:'扁平的二层网络'
最终配置文件
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 172.25.2.200 # master的内网地址 --> kube-apiserver的IP
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock # 内置了docker的shim
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
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers # 国内镜像无法拉取,这个属于个人维护,不属于'阿里云官方'维护
kind: ClusterConfiguration
kubernetesVersion: v1.19.3 # 修改为'实际的版本'
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16 # 如果选择flannel插件,需要给一个扁平的二层网络,注意不要与节点内网冲突
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs # 采用ipvs
'列出所需要的镜像' --> '必须指定配置文件,否则拉取的还是原来的'
kubeadm config images list --config kubeadm.yaml
也可以'提前先将相关镜像' pull 下来 --> '这步不操作,初始化的话也会pull'
kubeadm config images pull --config kubeadm.yaml
'指定yaml进行集群初始化'
kubeadm init --config kubeadm.yaml
'下面是流程图'
说明: 直接在root执行也可以,这里选择普通用户'kiosk'
node安装
(10)安装网络
download下来不管node还是master --> 只要能'与apiserver通信即可'
修改
- --iface=eth0 如果是'多网卡'的话,指定内网网卡的名称
kubectl apply -f kube-flannel.yml
(10)安装Dashboard
'下载'
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml
'修改' --> NodePort类型的 'Service'
'生效'
kubectl apply -f recommended.yaml
创建一个具有'全局所有权限'的用户来登录 Dashboard --> 'admin.yaml'
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: admin
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: admin
namespace: kubernetes-dashboard
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: kubernetes-dashboard
获取登陆Token
kubectl get secret admin-token-nwq6f -o jsonpath={.data.token} -n kubernetes-dashboard |base64 -d
用上面的 'base64 解码后'的'字符串'作为 token 登录 Dashboard
谷歌浏览器访问出现问题,'证书无法认证' -->Firefox可以访问
(11)最终的效果