参考文章:Kubernetes(K8S) 1.23.6版本基于Docker的集群安装部署
其他参考:Kubernetes集群环境的搭建
一、前言:
01、如安装过程中出错,可以把整个K8S删除掉,命令如下:
yum list installed|grep kube
yum -y remove cri-tools.x86_64 kubeadm.x86_64 kubectl.x86_64 kubelet.x86_64 kubernetes-cni.x86_64
02、删除已安装的docker可以使用命令如下:
注意安装ce版本,所以这里Docker安装20.10.7版本,containerd安装1.4.6版本
yum list installed|grep docker
yum -y remove containerd.io.x86_64 docker-ce.x86_64 docker-ce-cli.x86_64 docker-ce-rootless-extras.x86_64 docker-scan-plugin.x86_64
二、正式开始部署:
00、准备3台centeros机器,每台机器上都安装docker,此处略过。参考安装docker ce版本
参考地址:centos7基于yum repository方式安装docker和卸载docker
已安装docker低于1.13版本的docker需要修改如下:
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors":["https://dhjv7df4.mirror.aliyuncs","https://23ah010p.mirror.aliyuncs"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
并重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
01、准备3台centeros机器,并分别设置hostname:
hostnamectl set-hostname k8smaster
hostnamectl set-hostname k8snode1
hostnamectl set-hostname k8snode2
02、查看3台机器的ip,3台机器上都配置hosts文件,因k8s是依据hostname进行通信的。
cat >> /etc/hosts << EOF
192.168.3.48 k8smaster
192.168.3.50 k8snode1
192.168.3.49 k8snode2
EOF
03、每台机器上关闭防火墙并禁止使用swap交换,拷贝出来逐条执行
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
swapoff -a #关闭swap交换分区
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab #禁止swap交换分区开机自启
#合一为:
#systemctl stop firewalld && systemctl disable firewalld && setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config && swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
04、网桥设置
04-1 为了让服务器的iptables能发现bridged traffic,需要添加网桥过滤和地址转发功能
增加了一个bre_netfilter的网桥?
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
04-2 每台机器上将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system #使上一条命令的配置生效
04-3 加载br_netfilter网桥过滤模块,和加载网络虚拟化技术模块
modprobe br_netfilter
modprobe overlay
检验网桥过滤模块是否加载成功
[root@k8s-master ~]# lsmod | grep -e br_netfilter -e overlay
br_netfilter 22256 0
bridge 151336 1 br_netfilter
overlay 91659 0
[root@k8s-master ~]#
04-04 配置IPVS
service有基于iptables和基于ipvs两种代理模型。基于ipvs的性能要高一些。需要手动载入才能使用ipvs模块
安装ipset和ipvsadm
yum install ipset ipvsadm
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 +x /etc/sysconfig/modules/ipvs.modules
/bin/bash /etc/sysconfig/modules/ipvs.modules
# 检验模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
ip_vs_sh 12688 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 0
ip_vs 145458 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack_ipv4 15053 2
nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
nf_conntrack 139264 7 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_netlink,nf_conntrack_ipv4
libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrac
05、每台机器上NTP时间同步,使得所有节点的时间一致
yum install -y ntpdate #安装ntpdate用于校准时间,确保master和node时间同步
ntpdate time.windows #校准时间
06、每台机器上安装kubnets,以下命令逐条拷贝
06-1 每台机器上执行
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun/kubernetes/yum/doc/rpm-package-key.gpg
EOF
setenforce 0
yum install -y --setopt=obsoletes=0 --nogpgcheck kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
#为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建议修改改"/etc/sysconfig/kubelet"文件的内容:
vim /etc/sysconfig/kubelet
# 修改
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
systemctl enable kubelet --now
ps1:由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用 yum install -y --nogpgcheck kubelet kubeadm kubectl
安装
ps2:执行setenforce 0 报告 setenforce: SELinux is disabled
vi /etc/selinux/config
更改为:SELINUX=1,并重启电脑
查看是否安装成功,说明如下:
obsoletes等于1表示更新旧的rpm包的同时会删除旧包,0表示更新旧的rpm包不会删除旧包
kubelet启动后,可以用命令journalctl -f -u kubelet查看kubelet更详细的日志
kubelet默认使用systemd作为cgroup driver
启动后,kubelet现在每隔几秒就会重启,因为它陷入了一个等待kubeadm指令的死循环
06-2 执行安装镜像
[root@k8smaster yum.repos.d]# kubeadm config images list
I0716 12:41:12.720967 9862 version.go:255] remote version is much newer: v1.24.3; falling back to: stable-1.23
k8s.gcr.io/kube-apiserver:v1.23.17
k8s.gcr.io/kube-controller-manager:v1.23.17
k8s.gcr.io/kube-scheduler:v1.23.17
k8s.gcr.io/kube-proxy:v1.23.17
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6
将执行结果拷贝到image.sh文件中,然后分别在各机器上执行该脚本
master机器上包括以上所有,node节点上只包括kube-proxy和pause
master机器上脚本为
tee ./images.sh <<'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.23.17
kube-controller-manager:v1.23.17
kube-scheduler:v1.23.17
kube-proxy:v1.23.17
pause:3.6
etcd:3.5.1-0
coredns:v1.8.6
)
for imageName in ${images[@]} ; do
docker pull registry-hangzhou.aliyuncs/google_containers/$imageName
done
EOF
chmod +x ./images.sh && ./images.sh
node机器脚本为
tee ./images.sh <<'EOF'
#!/bin/bash
images=(
kube-proxy:v1.23.17
pause:3.6
)
for imageName in ${images[@]} ; do
docker pull registry-hangzhou.aliyuncs/google_containers/$imageName
done
EOF
chmod +x ./images.sh && ./images.sh
07、仅在master机器上执行,下面的ip替换为master的ip,务必阅读ps部分,需要拿输出的日志到nodes上执行
kubeadm init \
--apiserver-advertise-address=192.168.10.200 \
--control-plane-endpoint=k8smaster \
--image-repository registry-hangzhou.aliyuncs/google_containers \
--kubernetes-version v1.23.6 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=NumCPU
PS1:可能会报告 [ERROR NumCPU]: the number of available CPUs 1 is less than the required 2,是因为k8s至少在2核机器上运行,可以在命令最后增加 --ignore-preflight-errors=NumCPU
PS2:本命令执行完毕后,会在最后输出如下日志,提示在node节点上执行,必须要先记录下来以备后用:kubeadm join k8smaster:6443 --token ifhd1n.k8h6ikhb3sybeq7d \
--discovery-token-ca-cert-hash sha256:4f9baaa9bcc02735ab6f2cfaa670f5a7457016e7c82f0af3da92af0d3b73aa20
kubeadm join k8smaster:6443 --token 2o91aa.l2l560a1ymarxodn \
--discovery-token-ca-cert-hash sha256:307494813bfb489735f747d769177617ccab60a76c24a677d0f713f464d035bd
P3:启动占用的6443端口,可以通过kubectl cluster-info查看到
P4:如果init失败,可以通过如下方式回退
kubeadm reset -f
rm -rf /etc/kubernetes
rm -rf /var/lib/etcd/
rm -rf $HOME/.kube
08、仅在master机器上依据上面执行结果提示,需要先依次执行:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
09、仅在master机器上,安装flannel网络插件(亲测)或calico插件,目的是为kubernetes的机器提供一个子网.
或将该文件下载下来后,上传到$HOME/.kube目录下。
cd $HOME/.kube
wget https://gitee/mirrors/flannel/blob/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
PS1:安装完毕后可以通过 kubectl get pods -n kube-system|grep flannel 命令查看是否部署
10、查看健康状况,大概需要等N分钟会显示全部running,包括coredns
kubectl get pods -n kube-system
# 查看健康状态
kubectl get cs
#可能需要10分钟左右启动初始化完成,才有返回结果.然后再执行下一步
ps -ef|grep flannel|grep -v grep
#可能需要等待十几分钟,状态才能全部转为ready.然后再执行下一步
kubectl get nodes
11、在其他nodes 机器上执行,将另外2个子节点加入到master上管理,该命令来自master节点初始化的输出
kubeadm join k8smaster:6443 --token 2o91aa.l2l560a1ymarxodn \
--discovery-token-ca-cert-hash sha256:307494813bfb489735f747d769177617ccab60a76c24a677d0f713f464d035bd
如果不能加入可以重置后,继续敲上面的加入命令
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1
systemctl restart docker
systemctl start kubelet
kubeadm reset
PS1:在master机器上执行kubectl get nodes,大概需要等N分钟(8分钟左右)会出现加入的节点ready。
PS2:如果后期有node想加入,但是又不知道token,可以在master节点下操作生成一个新的token后依据提示加入集群:
kubeadm token create --print-join-command
三、安装K8S管理界面(K8S版本1.23.6)
Kubernetes官方可视化界面:https://github/kubernetes/dashboard
参考文章:helm安装kubernetes-dashboard(2.5.1)
官方地址:
https://raw.githubusercontent/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml
国内下载dashboard安装文件,请连接这里
02、执行命令
kubectl apply -f $HOME/.kube/kubernetes-dashboard.yaml
然后执行watch -n 3 kubectl get pods -A ,可以每3秒查看下pods状态,大概需要2分钟,可以看到dashboard及metrics被创建。
04、执行以下命令进入修改,将type: ClusterIP改为:type: NodePort
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
05、查看端口命令
kubectl get svc -A | grep kubernetes-dashboard
可以看到:dashboard的访问端口是30843.
因此访问192.168.3.48:30843就可访问到dashboard,注意必须使用https协议来访问。
https://192.168.3.48:30843/
chrome浏览器可能会提示"您的连接不是私密连接",此时可以在当前页面,不在地址栏,而是在键盘上直接输入thisisunsafe 此时页面会自动刷新进入。
[root@k8smaster .kube]# kubectl get svc -A | grep kubernetes-dashboard
kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.96.230.116 <none> 8000/TCP 7m47s
kubernetes-dashboard kubernetes-dashboard NodePort 10.96.75.51 <none> 443:30843/TCP 7m48s
进入后,需要输入管理员账号。
03、配置管理员账号
03-1 在master节点上创建访问账号
tee $HOME/.kube/dash.yaml <<'EOF'
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
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: kubernetes-dashboard
EOF
kubectl apply -f $HOME/.kube/dash.yaml
执行成功后可以看到
serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created
执行如下命令获取访问令牌
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
将令牌拷贝到访问页面即可进入k8s控制台。
04、进入控制台后, 同token 默认15分钟失效,修改为90天失效
在 deployments下找到dashborad,编辑增加,数字是秒为单位
- '--token-ttl=7776000'
05、 k8s拉取私有镜像需要在master节点产生密钥,并且在运行应用的使用使用密钥。执行如下命令在haiju-dev命名空间下创建了一个名字为docker-registry的密钥
kubectl create secret docker-registry haiju-docker \
--docker-server=registry-hangzhou.aliyuncs \
--docker-username='XXX@qq' \
--docker-password='XXXX' \
-n haiju-dev
官方例子
kubectl create secret docker-registry <name> --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
四、修改k8s部署端口范围
k8s总的nodeport方式端口默认为30000-32767。参考文章在 master节点上修改
vim /etc/kubernetes/manifests/kube-apiserver.yaml
#找到 --service-cluster-ip-range 这一行,在这一行的下一行增加 如下内容
- --service-node-port-range=1-65535
#最后重启下k8s服务
systemctl daemon-reload
systemctl restart kubelet
五、常见K8S命令
kubectl version
kubectl help
systemctl stop kubelet 停止服务
systemctl start kubelet 启动服务
kubectl get deploy # 查看部署了哪些容器
kubectl top node 查看node的cpu/内存情况
kubectl top pod 查看pod的资源使用情况
kubectl get all --all-namespaces -o wide 查看所有的部署容器
kubectl logs -f coredns-65c54cc984-25m2m -n kube-system 查看某个容器的日志
kubectl get pod -o wide 查看所有的pod,可以看到部署在哪些机器上
允许master节点部署pod
kubectl taint nodes --all node-role.kubernetes.io/master-
如果不允许调度
kubectl taint nodes 这里写node-name node-role.kubernetes.io/master=:NoSchedule
污点可选参数
NoSchedule: 一定不能被调度
PreferNoSchedule: 尽量不要调度
NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod
将已经安装的pod产生yml文件
# 找到安装的pod
kubectl get deploy -A
#生成yaml文件
kubectl get deploy kubernetes-dashboard -o yaml -n kubernetes-dashboard > 88.yaml
port: 暴露在cluster ip上的端口,port提供了集群内部客户端访问service的入口,即clusterIP:port
nodePort:
nodePort 提供了集群外部客户端访问 Service 的一种方式,nodePort 提供了集群外部客户端访问 Service 的端口,通过 nodeIP:nodePort
提供了外部流量访问k8s集群中service的入口。
targetPort:是pod的端口,从port和nodePort来的流量经过kube-proxy流入到后端pod的targetPort上,最后进入容器。
containerPort :pod内部容器的端口,targetPort映射到containerPort
流量走向
port/nodePort-----流量---->targetPort-----流量---->containerPort
镜像拉取策略 imagePullPolicy: IfNotPresent Always Never
1、查看有哪些节点
kubectl get nodes
1、查看命名空间下的所有服务
kubectl get pods -n kube-system -o wide
查看某个命名空间下的
kubectl get pods -n kube-system|grep flannel
2、查看所有pod的详细信息
kubectl get pod -o wide
2、查看安装了容器
kubectl get pods,svc
或者 kubectl get pod
3、删除某个服务
kubectl delete service kubernetes-dashboard --namespace=kube-system
4、安装nginx应用
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
5、查看所有的命名空间
kubectl get namespace
6、使用三大检查命令:
kubectl cluster-info
kubectl get nodes
kubectl describe node
更多推荐
K8S在centeros中的部署
发布评论