kubeadm部署一套完整的kubernetes1.18.x单节点集群

目录

1. 节点规划

2. 系统属性设置

2.1 属性配置脚本

3. 安装docker

3.1 联网方式安装docker

3.2 离线方式安装docker

3.3 查看docker版本信息 

4. 部署单个master节点的kubernetes集群

4.1 安装kubelet、kubeadm、kubectl

4.2 下载kubernetes镜像

4.3 初始化master节点

4.3.1 导出初始化配置文件

4.3.2 修改初始化配置文件

4.3.3 初始化master节点

4.3.4 配置kubeconfig环境变量

4.4 配置kubectl

4.5 部署Node节点

5. 安装calico网络插件

5.1 下载calico.yaml文件

5.2 下载calico镜像文件

5.3 创建calico网络

6. 添加Node节点

6.1 添加node

6.2 查看node信息

6.3 检查pod状态

6.4 检查集群状态

7. 安装kubectl命令自动补全

7.1 下载rpm包

7.2 安装命令补全rpm包

7.3 添加配置

8. 重置集群

9. 安装dashboard

注意:

9.1 下载dashboard.yaml文件

9.2 下载镜像

9.3 创建dashboard服务

9.4 修改dashboard的服务文件

9.5 创建dashboard管理用户

9.6 绑定用户为集群管理用户

9.7 查看secret名称

9.8 获取token

9.9 访问dashboard界面


1. 节点规划

HostnameIP地址系统版本内核版本安装组件备注
master01192.168.0.201CentOS7.6 18103.10.0

kubernetes 19.03.8

docker 1.18.4

master节点
node01192.168.0.211CentOS7.6 18103.10.0

kubernetes 19.03.8

docker 1.18.4

worker节点

(Node)

node02192.168.0.212CentOS7.6 18103.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登录界面的即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洒家肉山大魔王

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值