目录
- 实验前准备
- 部署K8S集群
- 初始化kubeadm(只需要master做)
- 部署网络插件flannel
- 测试 pod 资源创建
- 测试访问
- 部署Dashboard(master01)
- 浏览器访问
实验前准备
master:192.168.188.11
node01:192.168.188.13
node02:192.168.188.14
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i ‘s/enforcing/disabled/’ /etc/selinux/config
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
关闭交换分区
swapoff -a
sed -ri ‘s/.swap./#&/’ /etc/fstab
加载 ip_vs 模块
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
修改主机名
master01:hostnamectl set-hostname master01
node01:hostnamectl set-hostname node01
node02:hostnamectl set-hostname node02
修改hosts文件
vim /etc/hosts
192.168.188.11 master01
192.168.188.13 node01
192.168.188.14 node02
调整内核参数
vim /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv6.conf.all.disable_ipv6 = 1 net.ipv4.ip_forward = 1
sysctl --system
安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
#使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。
#日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。
cat > /etc/docker/daemon.json <<EOF { "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" } } EOF
systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service
docker info | grep “Cgroup Driver”
安装kubeadm、kubelet、kubectl
定义kubernetes源
cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11
开机自启kubelet,K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启
systemctl enable kubelet.service
部署K8S集群
查看初始化需要的镜像
kubeadm config images list
在master01节点上的/opt/k8s/v1.20.11目录下准备各组件的tar包
mkdir /opt/k8s/v1.20.11
cd /opt/k8s/v1.20.11
ls
然后直接下载到容器中
for i in $(ls *.tar); do docker load -i $i; done
复制镜像和脚本到 node 节点(master01)
scp -r /opt/k8s root@node01:/opt
scp -r /opt/k8s root@node02:/opt
并在 node 节点上执行脚本加载镜像文件(node01、node02)
cd /opt/k8s/v1.20.11
for i in $(ls *.tar); do docker load -i $i; done
初始化kubeadm(只需要master做)
方法一:
kubeadm config print init-defaults > /opt/kubeadm-config.yaml
cd /opt/
vim kubeadm-config.yaml
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
–experimental-upload-certs 参数可以在后续执行加入节点时自动分发证书文件,K8S V1.16版本开始替换为 --upload-certs
tee kubeadm-init.log 用以输出日志
如果因为某些原因导致第一次初始化失败了,出现以下报错
可以把kubeadm-config.yaml里面最后三行注释
运行成功时会有一大串显示,记住最后几行,其中–discovery-token-ca-cert-hash后面那一串就是token令牌
查看 kubeadm-init 日志
less kubeadm-init.log
kubernetes配置文件目录
ls /etc/kubernetes/
存放ca等证书和密码的目录
ls /etc/kubernetes/pki
方法二:
kubeadm init \ --apiserver-advertise-address=192.168.188.11 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version=v1.20.11 \ --service-cidr=10.96.0.0/16 \ --pod-network-cidr=10.244.0.0/16 \ --token-ttl=0
解释:
初始化集群需使用kubeadm init命令,可以指定具体参数初始化,也可以指定配置文件初始化。
可选参数:
–apiserver-advertise-address:apiserver通告给其他组件的IP地址,一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示节点上所有可用地址
–apiserver-bind-port:apiserver的监听端口,默认是6443
–cert-dir:通讯的ssl证书文件,默认/etc/kubernetes/pki
–control-plane-endpoint:控制台平面的共享终端,可以是负载均衡的ip地址或者dns域名,高可用集群时需要添加
–image-repository:拉取镜像的镜像仓库,默认是k8s.gcr.io
–kubernetes-version:指定kubernetes版本
–pod-network-cidr:pod资源的网段,需与pod网络插件的值设置一致。Flannel网络插件的默认为10.244.0.0/16,Calico插件的默认值为192.168.0.0/16;
–service-cidr:service资源的网段
–service-dns-domain:service全域名的后缀,默认是cluster.local
–token-ttl:默认token的有效期为24小时,如果不想过期,可以加上 --token-ttl=0 这个参数
方法二初始化后需要修改 kube-proxy 的 configmap,开启 ipvs
kubectl edit cm kube-proxy -n=kube-system
设定kubectl
kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,它可由 kubectl 通过默认的 “$HOME/.kube/config” 的路径进行加载。
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown
(
i
d
−
u
)
:
(id -u):
(id−u):(id -g) $HOME/.kube/config
kubectl get cs查看集群状态
如果发现集群不健康,更改以下两个文件
vim /etc/kubernetes/manifests/kube-scheduler.yaml
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
systemctl restart kubelet
部署网络插件flannel
所有节点上传flannel镜像 flannel.tar 到 /opt 目录,master节点上传 kube-flannel.yml 文件
cd /opt
docker load < flannel.tar
在master 节点创建 flannel 资源
kubectl apply -f kube-flannel.yml
在 node 节点上执行 kubeadm join 命令加入群集,这里的kubeadm join命令就是上面需要我们记住的代码段,直接复制粘贴就行
kubeadm join 192.168.188.11:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:ebbed4eeeff1d325c8892846b189211bfc5dec86689b3d992614830f8f7afcfe
在master节点查看节点状态
kubectl get nodes
kubectl get pods -n kube-system
测试 pod 资源创建
kubectl create deployment nginx --image=nginx
查看有没有创建
kubectl get pods -o wide
暴露端口提供服务
kubectl expose deployment nginx --port=80 --type=NodePort
查看
kubectl get svc
测试访问
32707是上面get svc中的80映射端口
curl http://node01:32707
扩展3个副本
kubectl scale deployment nginx --replicas=3
kubectl get pods -o wide
部署Dashboard(master01)
上传 recommended.yaml 文件到 /opt/k8s 目录中
cd /opt/k8s
vim recommended.yaml
默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部
kubectl apply -f recommended.yaml
创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk ‘/dashboard-admin/{print $1}’)
浏览器访问
https一定要加,NodeIp用master、node01、node02的都可以
https://NodeIP:30001
如果页面显示不是专用连接
那就直接键盘输入thisisunsafe就行,不用管在哪输入
然后使用token登录
然后就登录成功了