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  
posted @   Ranger-dev  阅读(88)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示