ubuntu20.10 server+docker20.10.6+k8s1.21.0
1、所有节点,这里是3台vm,分别改hostname
改hostname:vi /etc/hostname
hostname k8s-master131
建议把hostname对应的IP写进/etc/hosts文件,以便dns解析
cat >> /etc/hosts <<EOF
192.168.21.131 k8s-master131
192.168.21.132 k8s-node132
192.168.31.133 k8s-node133
EOF
2、所有节点,这里是3台vm,分别配置IP
192.168.21.131 k8s-master131
192.168.21.132 k8s-node132
192.168.21.133 k8s-node133
/etc/netplan,根据个人环境的不同来编辑IP,我的环境yaml文件为:00-installer-config.yaml
network:
ethernets:
ens3:
addresses: [192.168.21.131/24]
gateway4: 192.168.21.254
nameservers:
addresses: [202.96.134.133,114.114.114.114]
version: 2
3、修改为cst东八区时区,校准日期时间。
date -R
tzselect
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
sudo date -s MM/DD/YY //修改日期
sudo date -s hh:mm:ss //修改时间
在修改时间以后,修改硬件CMOS的时间
sudo hwclock --systohc
如果需要修改时间为24小时,我们可以修改/etc/default/locale,默认没有LC_TIME这个变量,我们在文件中增加一行,设置改变量如下:
cat /etc/default/locale
LANG=en_US.UTF-8
LC_TIME=en_DK.UTF-8
时间同步
ntpdate ntp.aliyun.com
4、防火墙设置
查看当前防火墙状态
在Ubuntu中 我们使用sudo ufw status命令查看当前防火墙状态;inactive状态是防火墙关闭状态 active是开启状态。
开启防火墙
在Ubuntu中 我们使用sudo ufw enable命令来开发防火墙 通过sudo ufw status命令查看开启防火墙后的状态为active 说明防火墙开启成功。
关闭防火墙
在Ubuntu中 我们使用sudo ufw disable命令来关闭防火墙。执行该命令之后 我们使用sudo ufw status命令来查看当前防火墙的状态 如果是inactive 说明我们的防火墙已经关闭掉了。
Ubuntu中其他常用的防火墙命令
ufw default allow/deny:外来访问默认允许/拒绝
ufw allow/deny 20:允许/拒绝 访问20端口,20后可跟/tcp或/udp,表示tcp或udp封包。
ufw allow/deny servicename:ufw从/etc/services中找到对应service的端口,进行过滤。
ufw allow proto tcp from 10.0.1.0/10 to 本机ip port 25:允许自10.0.1.0/10的tcp封包访问本机的25端口。
ufw delete allow/deny 20:删除以前定义的"允许/拒绝访问20端口"的规则
例如开启允许80端口被访问,如下图所示
5、禁用swap
sudo swapoff -a
将文件系统设置为可读写
sudo mount -n -o remount,rw /
将文件中的swap行使用#注释掉
sudo vim /etc/fstab
重启电脑或exit后再进。
reboot
6.使流量通过iptables
加载模块
sudo modprobe br_netfilter
检查是否加载
lsmod | grep br_netfilter
br_netfilter 28672 0
bridge 200704 1 br_netfilter
配置正确流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
应用配置
sudo sysctl --system
7、docker安装
# step 1: 安装必要的一些系统工具
apt-get update
apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# Step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu$(lsb_release -cs)stable"
# Step 4: 更新并安装v20.10.0版的Docker-CE
国内源安装指定的docker版本可参考:https://blog.csdn.net/weixin_41082546/article/details/106789673
apt-get -y update
查看源力包含哪些docker版本
apt-cache madison docker-ce
安装指定的docker版本
格式为:
sudo apt-get install docker-ce=<VERSION>
例如:apt-get install docker-ce=5:20.10.6~3-0~ubuntu
docker version
# Step 5:配置镜像加速
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://wvmqh31a.mirror.aliyuncs.com"]}EOF
.# Step 6:kubelet需要让docker容器引擎使用systemd作为CGroup的驱动,其默认值为cgroupfs,因而,我们还需要编辑docker的配置文件/etc/docker/daemon.json,添加如下内容。"exec-opts": ["native.cgroupdriver=systemd"]
因此daemon.json内容如下:
{
"registry-mirrors": ["https://wvmqh31a.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
# Step 7:重新加载配置文件,然后重启服务,并且设置为开机启动。
systemctl daemon-reload
systemctl restart docker
systemctlenabledocker
8、在各主机上生成kubelet和kubeadm等相关程序包的仓库,这里使用阿里云镜像源
# curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# cat <<EOF >/etc/apt/sources.list.d/kubernetes.listdeb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF# apt update
9、安装kubelet、kubeadm、kubectl,并将kubelet设置为开机启动
# apt install kubelet=1.21.0-00 kubeadm=1.21.0-00 kubectl=1.21.0-00 -y
# systemctl enable kubelet
注: 安装完成后,要确保kubeadm等程序文件的版本,这将也是后面初始化Kubernetes集群时需要明确指定的版本号
10、初始化Master节点
# kubeadm init \
--apiserver-advertise-address=192.168.21.131 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.21.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--token-ttl=0
命令中的各选项简单说明如下:
--apiserver-advertise-address:apiserver通告给其它组件的IP地址,一般应该为Master节点用于集群内部通信的IP地址
--image-repository:指定要使用的镜像仓库,默认为gcr.io
kubernetes-version:kubernetes程序组件的版本号,必须要与前面安装的版本一致
--service-cidr:集群内部虚拟网络,Pod统一访问入口;service的网络地址范围,其值为CIDR格式的网络地址,默认地址为10.96.0.0/12
--pod-network-cidr:Pod网络的地址范围,其值为CIDR格式的网络地址,通常,Flannel网络插件的默认为10.244.0.0/16,Project Calico插件的默认值为192.168.0.0/16;本章使用的是calico插件,所以下面部署CNI网络插件时需要与这里设置的保持一致。
--token-ttl:共享令牌(token)的过期时长,默认为24小时,0表示永不过期;为防止不安全存储等原因导致的令牌泄露危及集群安全,建议为其设定过期时长。未设定该选项时,在token过期后,若期望再向集群中加入其它节点,可以使用如下命令重新创建token,并生成节点加入命令。
一般能顺利把k8s系统自身kube-system组件的镜像拉下来:
kube-apiserver
kube-proxy
kube-scheduler
kube-controller-manager
pause
coredns
etcd
也可以手动docker pull下来,或者重tar包导入。
这里可能回用到:
docker pull
docker tag
docker load -i
11、设定kubectl
kubectl是kube-apiserver的命令行客户端程序,实现了除系统部署之外的几乎全部的管理操作,是kubernetes管理员使用最多的命令之一。kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm部署的集群为其生成了一个具有管理员权限的认证配置文件/etc/kubernetes/admin.conf,它可由kubectl通过默认的"$HOME/.kube/config"的路径进行加载。当然,用户也可在kubectl命令上使用--kubeconfig选项指定一个别的位置。
下面复制认证为Kubernetes系统管理员的配置文件至目标用户(例如当前用户root)的家目录下,用于kubectl连接Kubernetes集群:
# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config
12、下载calico.yaml、修改对应IP网段
wget https://docs.projectcalico.org/manifests/calico.yaml
# 下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init命令中使用的--pod-network-cidr选项指定的一样
3672 - name: CALICO_IPV4POOL_CIDR
3673 value: "10.244.0.0/16"
kubectl apply -f calico.yaml
13、确认部署网络插件的Pod正常运行状态
# kubectl get pod -n kube-system -l k8s-app=calico-node
NAME READY STATUS RESTARTS AGE
calico-node-26s88 1/1 Running 0 8m31s
calico-node-c2mpn 1/1 Running 0 8m28s
calico-node-dhhg8 1/1 Running 0 15m
14、验证master节点已经就绪
kubectl get nodes
15、添加Node节点到集群中
kubeadm join 192.168.21.131:6443 --token 19ovkd.gnzmwvarw3zocqgs \
> --discovery-token-ca-cert-hash sha256:4109f5d6d92c94a6c36814cf0f1ae53a885369fb3d4652f67cca9b5ec436ff89
16、配置kubectl命令自动补全功能
# echo "source <(kubectl completion bash)" >> ~/.profile
17、验证
17.1 kubectl get cs;kubectl get node
17.2 kubectl create deployment nginx --image=nginx
从上面的返回结果中来看,新建的Pod转态为"Running",并且就绪。表示运行正常。
验证Pod网络通信:
17.3 kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
17.4 验证DNS解析
使用busybox:1.28.4镜像创建一个pod,用于dns解析上面创建的service名称
kubectl run -it --rm --image=busybox:1.28.4 sh
18、部署Dashboard
18.1 下载配置清单文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
18.2 修改相关内容
18.3 应用配置清单文件,创建相关资源
kubectl apply -f recommended.yaml
18.4访问Dashboard
打开浏览器,输入集群中任意节点的IP以https://NodeIP:30001格式访问
18.5 生成token
root@k8s-master131:~# kubectl get ClusterRole|grep -i cluster-admin
cluster-admin 2021-04-12T17:09:47Z
18.6创建service account并绑定默认cluster-admin管理员集群角色:
创建用户:
kubectl create serviceaccount dashboard-admin -n kube-system
用户授权,把dashboard-admin用户与cluster-admin管理员集群角色绑定:
kubectl create clusterrolebinding dashboard-admin-binding --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 获取用户token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
也可以通过yaml文件创建:
授予Dashboard账户集群管理权限
要让dashboard可以访问集群的各种资源,需要给dashboard账户赋予权限,这一步很关键,如果你缺少这一步的话,你打开dashboard后会报很多forbidden,如下:
configmaps is forbidden: User "system:serviceaccount:kube-system:service-controller" cannot list resource "configmaps" in API group "" in the namespace "default"
close
warning
persistentvolumeclaims is forbidden: User "system:serviceaccount:kube-system:service-controller" cannot list resource "persistentvolumeclaims" in API group "" in the namespace "default"
close
warning
....
要获得管理集群的权限,新建admin-user-admin.rbac.yaml文件,内容如下
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
---
# Create ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
执行
[root@master] ~$ kubectl create -f admin-user-admin.rbac.yaml
找到admin-user-admin的token,记下这串token,等下登录的时候会使用,这个token默认是永久的。
[root@master] ~$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')