kubernetes-kubeadm
使用kubeadm安装
通过vagrant的Vagrantfile新建三台主机
主机名 | IP |
---|---|
master1 | 192.168.33.11 |
node1 | 192.168.33.12 |
node2 | 192.168.33.13 |
Vagrantfile
Vagrant.configure("2") do |config|
config.vm.define "k8s-01" do |master|
master.vm.box = "centos-base"
master.vm.provider "virtualbox" do |vb|
vb.memory = "2048"
vb.cpus = 2
end
master.vm.network "private_network", ip: "192.168.33.11", auto_config: true
master.vm.hostname = "master1"
master.vm.provision "shell", path: "./init.sh"
end
config.vm.define "k8s-02" do |node1|
node1.vm.box = "centos-base"
node1.vm.network "private_network", ip: "192.168.33.12", auto_config: true
node1.vm.hostname = "node1"
node1.vm.provision "shell", path: "./init.sh"
end
config.vm.define "k8s-03" do |node2|
node2.vm.box = "centos-base"
node2.vm.network "private_network", ip: "192.168.33.13", auto_config: true
node2.vm.hostname = "node2"
node2.vm.provision "shell", path: "./init.sh"
end
end
初始化脚本:
#!/bin/bash
# 初始化yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
yum makecache fast
# 安装系统性能分析工具及其他
yum install gcc make autoconf vim sysstat net-tools iostat iftop iotp wget lrzsz lsof unzip openssh-clients net-tool vim ntpdate -y
# 设置时区并同步时间
timedatectl set-timezone Asia/Shanghai
ntpdate time.windows.com
if ! crontab -l |grep ntpdate &>/dev/null ; then
(echo "* 1 * * * ntpdate time.windows.com >/dev/null 2>&1";crontab -l) |crontab
fi
# 历史命令显示操作时间
if ! grep HISTTIMEFORMAT /etc/bashrc; then
echo 'export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S `whoami` "' >> /etc/bashrc
fi
# 设置最大打开文件数/最大线程个数
if ! grep "* soft nofile 65535" /etc/security/limits.conf &>/dev/null; then
cat >> /etc/security/limits.conf << EOF
* soft nofile 65535
* hard nofile 65535
* soft nproc 4096
* hard nproc 4096
EOF
fi
# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# 禁selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
echo "禁swap"
sed -ri 's/.*swap.*/#&/' /etc/fstab
swapoff -a
echo '允许 iptables 检查桥接流量'
modprobe br_netfilter
echo '写入配置参数'
cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
echo '安装docker'
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
cat <<EOF > /etc/docker/daemon.json
{
"registry-mirrors": ["https://f2q9sv8j.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
// 可选docker私有仓库
"insecure-registries" : ["192.168.44.22"]
}
EOF
systemctl enable docker
systemctl daemon-reload
systemctl restart docker
echo 'kubernetes 安装'
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
setenforce 0
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
主节点执行, 主节点初始化后会产生一段从节点join命令 复制后在从节点执行
master1:
kubeadm init --apiserver-advertise-address=192.168.33.11 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.23.3 --pod-network-cidr=10.244.0.0/16
node1 & node2
kubeadm join 192.168.33.11:6443 --token b4b3u4.0sffdr3p2akoszzn --discovery-token-ca-cert-hash sha256:f4dd5b9820f40aafb34219a23a79e0205ad768ce4dca2528b5c7e07f43ed573d
在主节点操作集群
export KUBECONFIG=/etc/kubernetes/admin.conf
kubectl get nodes
部署kube-flannel网络, 注意多网卡配置
kubectl apply -f kube-flannel.yml
部署ingress-nginx
镜像问题 https://blog.csdn.net/weixin_43988498/article/details/122792536
给其中一个工作节点打标签
kubectl label node k8s-node app=ingress
主机模式运行
在401 行加上
hostNetwork: true
nodeSelector:
app: ingress
kubernetes.io/os: linux
# 部署
kubectl apply -f ingress-nginx.yaml
# 删除
kubectl delete -f ingress-nginx.yaml
# 查看pod
kubectl get all -n ingress-nginx
# 查看部署情况
kubectl describe pod -n ingress-nginx
ex: 开启ssh连接
由于vagrant默认无密码密钥验证连接,为了便于管理,建议开启ssh开启密码连接,修改/etc/ssh/sshd_config文件,开启密码验证(记得使用passwd修改密码)
vim /etc/ssh/sshd_config
#开启PasswordAuthentication选项为yes 注释掉为no的选项
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication yes
#PermitEmptyPasswords no
#PasswordAuthentication no
-------------------------
systemctl restart sshd
新节点加入
0. vim /etc/hosts 所有节点加入新节点主机名解析
1、master中的节点认证信息24小时会失效,可以重新生成(master端操作)
#创建token
kubeadm token create
8wcpii.r1bqulinm5nw96ep
#创建新的sha
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
e17029dc05a6f803dec51dfa0eb821c9dc6998ad6659f16db6a612e99d233f24
# kubeadm join 192.168.44.11:6443 --token 【token】--discovery-token-ca-cert-hash sha256:【sha值】
kubeadm join 192.168.44.11:6443 --token 8wcpii.r1bqulinm5nw96ep --discovery-token-ca-cert-hash sha256:e17029dc05a6f803dec51dfa0eb821c9dc6998ad6659f16db6a612e99d233f24
让Master也能当作Node使用(允许将Pod副本调度到Master节点上)
kubectl get nodes
kubectl taint node xxx-nodename node-role.kubernetes.io/master-
#将 Master 也当作 Node 使用
kubectl taint node xxx-nodename node-role.kubernetes.io/master="":NoSchedule
#将 Master 恢复成 Master Only 状态
测试
1. 创建Deployment
# 创建nginx配置文件
vim nginx-deployment.yaml
# 文件内容
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
# 部署
kubectl apply -f nginx-deployment.yaml
部署后,我们查看deployment信息
# 查看所有节点信息
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-59c9f8dff-4n258 1/1 Running 0 20m
nginx-deployment-59c9f8dff-528g8 1/1 Running 0 20m
# 查看更详细的节点信息
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-59c9f8dff-4n258 1/1 Running 0 21m 10.244.2.2 node2 <none> <none>
nginx-deployment-59c9f8dff-528g8 1/1 Running 0 21m 10.244.1.2 node1 <none> <none>
2. 曝露资源
发现deployment被分布在了node1和node2上,尝试曝露服务给Service
kubectl expose deployment nginx-deployment --port=80 --type=NodePort
查看曝露的服务,由此,可以开始外网访问了
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 105m
nginx-deployment NodePort 10.1.155.69 <none> 80:30373/TCP 25m
发现对外网曝露的端口是30373,我们可以使用NodePort:30373 进行访问了
kubectl 常用命令总结
# 查看所有 pod 列表, -n 后跟 namespace, 查看指定的命名空间
kubectl get pod
kubectl get pod -n kube
kubectl get pod -o wide
# 查看全部
kubectl get pods --all-namespaces
# 查看 RC 和 service 列表, -o wide 查看详细信息
kubectl get rc,svc
kubectl get pod,svc -o wide
kubectl get pod <pod-name> -o yaml
# 显示 Node 的详细信息
kubectl describe node 192.168.0.212
# 显示 Pod 的详细信息, 特别是查看 pod 无法创建的时候的日志
kubectl describe pod <pod-name>
eg:
kubectl describe pod redis-master-tqds9
# 根据 yaml 创建资源, apply 可以重复执行,create 不行
kubectl create -f pod.yaml
kubectl apply -f pod.yaml
# 基于 pod.yaml 定义的名称删除 pod
kubectl delete -f pod.yaml
# 删除所有包含某个 label 的pod 和 service
kubectl delete pod,svc -l name=<label-name>
# 删除所有 Pod
kubectl delete pod --all
# 查看 endpoint 列表
kubectl get endpoints
# 执行 pod 的 date 命令
kubectl exec <pod-name> -- date
kubectl exec <pod-name> -- bash
kubectl exec <pod-name> -- ping 10.24.51.9
# 通过bash获得 pod 中某个容器的TTY,相当于登录容器
kubectl exec -it <pod-name> -c <container-name> -- bash
eg:
kubectl exec -it redis-master-cln81 -- bash
# 查看容器的日志
kubectl logs <pod-name>
kubectl logs -f <pod-name> # 实时查看日志
kubectl log <pod-name> -c <container_name> # 若 pod 只有一个容器,可以不加 -c
kubectl logs -l app=frontend # 返回所有标记为 app=frontend 的 pod 的合并日志。
# 查看注释
kubectl explain pod
kubectl explain pod.apiVersion
# 查看节点 labels
kubectl get node --show-labels
# 重启 pod
kubectl get pod <POD名称> -n <NAMESPACE名称> -o yaml | kubectl replace --force -f -
# 修改网络类型
kubectl patch service istio-ingressgateway -n istio-system -p '{"spec":{"type":"NodePort"}}'
# 伸缩 pod 副本
# 可用于将Deployment及其Pod缩小为零个副本,实际上杀死了所有副本。当您将其缩放回1/1时,将创建一个新的Pod,重新启动您的应用程序。
kubectl scale deploy/nginx-1 --replicas=0
kubectl scale deploy/nginx-1 --replicas=1
# 查看前一个 pod 的日志,logs -p 选项
kubectl logs --tail 100 -p user-klvchen-v1.0-6f67dcc46b-5b4qb > pre.log
# 查看ingress
kubectl get ingress <name>
# k8s查看所有在运行pod内的镜像版本
kubectl -n xxx get pods | grep Running | awk '{print $1}' | xargs -r -I '{}' kubectl -n xxx get pods {} -o=jsonpath='{.status.containerStatuses[0].image}{"\n"}' | sort
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现