目录
1. 节点规划
Hostname | IP地址 | 系统版本 | 内核版本 | 安装组件 | 备注 |
---|---|---|---|---|---|
master01 | 192.168.0.201 | CentOS7.6 1810 | 3.10.0 | kubernetes 19.03.8 docker 1.18.4 | master节点 |
node01 | 192.168.0.211 | CentOS7.6 1810 | 3.10.0 | kubernetes 19.03.8 docker 1.18.4 | worker节点 (Node) |
node02 | 192.168.0.212 | CentOS7.6 1810 | 3.10.0 | kubernetes 19.03.8 docker 1.18.4 | worker节点 (Node) |
2. 系统属性设置
以下基础属性需要在kubernetes的master和node节点器上进行配置。
如果采用虚拟机进行集群组件,要注意每个虚拟机的MAC地址需要设置为不同的地址。
2.1 属性配置脚本
由于所有的系统属性配置都要在master和worker节点上均操作一遍。为了省事,我们可以将操作的内容写在脚本里一键执行:01-env-init.sh
#!/bin/bash
echo "----------------关闭防火墙------------------"
systemctl stop firewalld && systemctl disable firewalld
echo "----------------关闭selinux-----------------"
# 临时关闭
setenforce 0
# 永久禁用
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
echo "----------------关闭swap--------------------"
swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab
echo "----------------设置主机名------------------"
# 在master01节点上执行该脚本时,hostnamectl set-hostname master01
hostnamectl set-hostname master01
# 在node01节点上执行该脚本时, hostnamectl set-hostname node01
#hostnamectl set-hostname node01
# 在node02节点上执行该脚本时,hostnamectl set-hostname node02
#hostnamectl set-hostname node02
echo "----------------设置hosts------------------"
cat >> /etc/hosts<<EOF
192.168.1.200 master01
192.168.1.211 node01
192.168.1.212 node02
EOF
echo "----------------设置时间同步------------------"
yum install chrony -y
systemctl start chronyd
systemctl enable chronyd
chronyc sources
echo "----------------配置ip_forward-------------"
cat <<EOF | sudo tee /etc/sysctl.conf
net.ipv4.ip_forward=1
EOF
echo "----------------修改内核参数----------------"
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
echo "----------------重启本机------------------"
sleep 5
reboot -f
3. 安装docker
3.1 联网方式安装docker
执行脚本:02-install-docker.sh
#!/bin/bash
# 配置yum源
cd /etc/yum.repos.d ; mkdir bak; mv CentOS-Linux-* bak/
# centos7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
echo "----------------安装依赖包----------------"
# 安装yum-config-manager配置工具
yum install yum-utils device-mapper-persistent-data lvm2 -y
echo "----------------设置dokcer源--------------"
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
echo "----------------docker版本列表------------"
yum list docker-ce --showduplicates | sort -r
echo "----------------安装docker-19.03.8-------"
yum install docker-ce-19.03.8 docker-ce-cli-19.03.8 containerd.io -y
echo "---------重启并设置docker开机启动--------"
systemctl daemon-reload
systemctl enable docker
systemctl start docker
#查看docker版本号
docker --version
echo "----------------修改docker镜像源----------"
# Docker镜像源设置
# 修改文件 /etc/docker/daemon.json,没有这个文件就创建
# 添加以下内容后,重启docker服务:
cat >/etc/docker/daemon.json<<EOF
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
EOF
# 加载
systemctl reload docker
# 查看
systemctl status docker containerd
3.2 离线方式安装docker
【1】预先下载docker相关的安装包:
【2】执行安装命令:
yum –y install *.rpm
或者
rpm –ivh *.rpm
【3】设置开机启动
systemctl daemon-reload && systemctl restart docker
【4】配置docker镜像源
修改文件: vi /etc/docker/demon.json
{
"registry-mirrors": ["https://v16stybc.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"graph": "/data/docker"
}
3.3 查看docker版本信息
4. 部署单个master节点的kubernetes集群
4.1 安装kubelet、kubeadm、kubectl
注意:
- 以下操作无论是master节点和worker节点均执行。
[root@master01 bin]# cat 03-install-k8s-tool.sh
#!/bin/bash
echo "----------------配置k8s yum源--------------"
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[k8s]
name=k8s
enabled=1
gpgcheck=0
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
EOF
# 导出默认配置,config.toml这个文件默认是不存在的
containerd config default > /etc/containerd/config.toml
grep sandbox_image /etc/containerd/config.toml
sed -i "s#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml
grep sandbox_image /etc/containerd/config.toml
echo "----------------kubelet版本信息列表------------------------"
yum list kubelet --showduplicates | sort -r
echo "----------------安装kubeadm、kubelet、kubectl(master节点)--------------"
# 不指定版本就是最新版本,当前最新版就是1.24.1
k8s_version=1.18.4
yum install -y kubelet-${k8s_version} kubeadm-${k8s_version} kubectl-${k8s_version} --disableexcludes=kubernetes
# disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库
# 设置为开机自启并现在立刻启动服务 --now:立刻启动服务
systemctl enable --now kubelet
# 查看状态,这里需要等待一段时间再查看服务状态,启动会有点慢
systemctl status kubelet
#echo "----------------安装kubelet1.18.4版本----------------------"
#yum install kubelet-1.18.4 kubeadm-1.18.4 kubectl-1.18.4 -y
#设置开机启动
systemctl daemon-reload
#systemctl start kubelet.service
systemctl enable kubelet.service
4.2 下载kubernetes镜像
注意:
- 以下操作无论是master节点和worker节点均执行。
[root@master01 bin]# cat 04-install-k8s-rpm.sh
#!/bin/bash
echo "----------------下载kubernetes镜像-----------------"
url=registry.cn-hangzhou.aliyuncs.com/google_containers
version=v1.18.4
images=(`kubeadm config images list --kubernetes-version=${version}|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
docker pull $url/$imagename
docker tag $url/$imagename k8s.gcr.io/$imagename
docker rmi -f $url/$imagename
done
kubernetes镜像:
4.3 初始化master节点
注意:
- 仅仅在master节点上执行初始化操作,切勿在node上操作。
4.3.1 导出初始化配置文件
kubeadm config print init-defaults > kubeadm-init-master.yaml
4.3.2 修改初始化配置文件
注意:
- advertiseAddress要改成主节点的物理IP,
- kubernetesVersion版本号改为实际安装的版本号。
4.3.3 初始化master节点
kubeadm init --config=kubeadm-init-master.yaml --upload-certs --ignore-preflight-errors=all
这里重点关注红框内容:
- 红框-1:用于kubelet操作权限
- 红框-2:将node节点添加到kubernetes的执行命令
4.3.4 配置kubeconfig环境变量
export KUBECONFIG=/etc/kubernetes/admin.conf
或者
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
4.4 配置kubectl
在master节点上执行下边命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
注意:
这里kubelet服务开机启动在前边安装k8s工具组件的脚本里已执行。
其次,关于node节点问题
1-当node节点上执行kubectl get nodes –o wide –A失败,出现以下异常提示时:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
2-将master的/etc/kubernetes/admin.conf文件复制一份到node节点的相同路径下,然后执行
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile && source ~/.bash_profile
4.5 部署Node节点
Node节点基础安装需要以下:
- 安装docker
- 安装kubelet、kubeadm、kubectl
- 下载kubernetes镜像
上述3步安装方式和前边安装内容方式一致的,这里不再赘述,在node节点机器上再操作一把即可。
注意:
此时,master节点和worker节点之间是各自独立的节点,彼此网络不通的,接下来,我们需要在各个节点上安装calico网络插件。
5. 安装calico网络插件
5.1 下载calico.yaml文件
curl https://docs.projectcalico.org/v3.14/manifests/calico.yaml -o calico.yaml
参考官网教程:
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network
5.2 下载calico镜像文件
注意:
- 以下操作无论是master节点和worker节点均下载calico镜像
- 创建网络时,只需在master上操作一次即可。
- 这里仅下载镜像,并为创建网络。放在后边初始化master节点时将执行网络创建,这里暂时跳过。
docker pull calico/node:v3.14.2
docker pull calico/pod2daemon-flexvol:v3.14.2
docker pull calico/cni:v3.14.2
docker pull calico/kube-controllers:v3.14.2
calico镜像如下图所示:
5.3 创建calico网络
集群必须安装网络插件以实现Pod间通信,在Master节点上操作calico.yml文件,其他Node节点会自动创建相关Pod;而且,其他Node节点只需加载calico镜像即可。
kubectl create -f calico.yaml
查看节点状态已经是Ready状态了。
6. 添加Node节点
6.1 添加node
登录worker节点机器,执行命令获取添加节点的证书数据。
获取join命令参数,并保存输出结果:
kubeadm token create --print-join-command > node-join.sh
添加Node节点,则直接在对应的node节点上执行下面的命令:
[root@node01 ymal]# sh node-join.sh
[root@node01 ymal]# sh node-join.sh
W1001 23:27:00.198417 10430 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane settings will be ignored when control-plane flag is not set.
[preflight] Running pre-flight checks
[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/
[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 20.10.12. Latest validated version: 19.03
[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.18" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
[root@node01 ymal]#
6.2 查看node信息
等待master01节点验证通过后,我们在Master上查看Node信息:
6.3 检查pod状态
6.4 检查集群状态
7. 安装kubectl命令自动补全
为了方便使用TAB键快速补全操作指令,我们可以安装kubectl命令自动补全rpm包。
7.1 下载rpm包
yum install --downloadonly --downloaddir=./ -y bash-completion
7.2 安装命令补全rpm包
rpm -ivh bash-completion-2.1-8.el7.noarch.rpm
7.3 添加配置
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
8. 重置集群
如果需要还原通过kubeadm init创建的cluster,执行重置命令:kubeadm reset
注意:需要在Master和Node节点上都执行一次重置命令
9. 安装dashboard
注意:
- master和node节点上均要加载这两个镜像。
- 创建出dashboard服务,需要执行命令即可:kubectl create -f dashboard.yaml
9.1 下载dashboard.yaml文件
下载yaml文件:
[root@master01 dashboard]# curl https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml -o dashboard.yaml
9.2 下载镜像
[root@master01 dashboard]# docker pull kubernetesui/metrics-scraper:v1.0.4
[root@master01 dashboard]# docker pull kubernetesui/dashboard:v2.0.0
加载镜像:
[root@master01 dashboard]# docker load -i dashboard-2.0.0.tar
69e42300d7b5: Loading layer [==================================================>] 224.6MB/224.6MB
Loaded image: kubernetesui/dashboard:v2.0.0
[root@master01 dashboard]#
[root@master01 dashboard]#
[root@master01 dashboard]# docker load -i metrics-scraper-1.0.4.tar
57757cd7bb95: Loading layer [==================================================>] 238.6kB/238.6kB
14f2e8fb1e35: Loading layer [==================================================>] 36.7MB/36.7MB
52b345e4c8e0: Loading layer [==================================================>] 2.048kB/2.048kB
Loaded image: kubernetesui/metrics-scraper:v1.0.4
[root@master01 dashboard]#
9.3 创建dashboard服务
在内网环境,如果是手工导入镜像,则需要将imagePullPolicy从always改成Never,防止重新拉取镜像。
spec:
containers:
- name: kubernetes-dashboard
image: kubernetesui/dashboard:v2.0.0
imagePullPolicy: Never
创建出dashboard服务,需要执行命令即可:kubectl create -f dashboard.yaml
9.4 修改dashboard的服务文件
修改dashboard的服务文件,将type修改为NodePort,使其可以通过节点IP访问。
[root@master01 dashboard]# kubectl edit svc -n kubernetes-dashboard kubernetes-dashboar
9.5 创建dashboard管理用户
执行下面的命令,创建dashboard管理用户:
[root@master01 dashboard]#
[root@master01 dashboard]# kubectl create serviceaccount dashboard-admin -n kube-system
serviceaccount/dashboard-admin created
[root@master01 dashboard]#
9.6 绑定用户为集群管理用户
绑定用户为集群管理用户:
[root@master01 dashboard]#
[root@master01 dashboard]# kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
clusterrolebinding.rbac.authorization.k8s.io/dashboard-cluster-admin created
[root@master01 dashboard]#
9.7 查看secret名称
[root@master01 dashboard]#
[root@master01 dashboard]# kubectl get secret -A|grep dashboard-admin-token
kube-system dashboard-admin-token-rwqg5 kubernetes.io/service-account-token 3 2m57s
[root@master01 dashboard]#
9.8 获取token
[root@master01 dashboard]#
[root@master01 dashboard]# kubectl describe secrets -n kube-system dashboard-admin-token-rwqg5
Name: dashboard-admin-token-rwqg5
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: dashboard-admin
kubernetes.io/service-account.uid: c9000da2-b3cf-4b69-b31c-a47d9c537558
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IkJ2QXMzcF9ESzRxaF9CdHhub3pRQ1JPcFdZSHRfMGxFT0VUS0tubEtvVjAifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tcndxZzUiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYzkwMDBkYTItYjNjZi00YjY5LWIzMWMtYTQ3ZDljNTM3NTU4Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.Q_NW5Ua3rDXzJr5MqEhZaoEqZy-6jEL0nN4MMrjAnO740FhiOxshTpTUBZY6uSjrTVrTcU5rC_WvqYA7ZNNP81RSX15K01gyE0OYJ02iMBmePW5EmY-nWyJG9QNGzC8P8YMj5WYjPI3LUk0FymZNFSWpVHapvz1dIm-JhJ2mJSrCKmNxy_WHCYaoeuJaQhS1NjjzsZ7lanuMEMpLQQCNt8q0dG1vr5qORXv4HrOWTWe0SZo6ruqtx40yBwfeapKopC-AbKxC-wlOSUrzlkEGgw28XepV6pddt_kV_QdQTw1HKMFWZwmKzIaiM2WJsmwbuafruGpRatVF2rtdYF0A9g
[root@master01 dashboard]#
使用Node节点IP和NodePort端口,以token方式登录Kubernetes Dashboard。
9.9 访问dashboard界面
【1】由于没有ingress,使用的是IP访问。所以会提示我们证书不安全,我们这里点击忽略直接访问。个别浏览器会造成打不开的,建议使用谷歌或火狐
访问地址:https://节点物理机IP:NodePort端口/
查看一下,端口是31000
【2】这里需要我们输入api-server指定的文件里面的账号密码。跳过是没有权限查看k8s里面所有的信息。
这里我们选择Token登录方式:
【3】将token信息填入dashboard登录界面的即可。