K8s 多节点部署流程

最近学习 k8s 集群,这边文章记录一下我搭建k8s集群的步骤
我这边采用的是 kubeadm 来部署集群,还有二进制文件的方式部署

首先说一下我这边的所有节点:(ip 是假的,依据自己情况来)
192.168.0.121 k8s-master1
192.168.0.107 k8s-worker1

以下 1-12 的操作需要在每个节点上都执行一遍…
具体的效果图我就不贴了…
这些操作相当于初始化集群的操作…

1.节点设置一下自己的 hostname
# 在对应的机器上执行

# master 节点上运行:
hostnamectl set-hostname k8s-master1
# worker 节点上运行:
hostnamectl set-hostname k8s-node1
# 以此类推...

设置完成后退出重新登陆一下就可以看到效果了

2.设置sshd禁止DNS解析,以提高ssh连接速度
# 修改配置文件
sed -i '/#UseDNS yes/aUseDNS no' /etc/ssh/sshd_config
# 重启
systemctl restart sshd

没有为什么,执行就对了

3.更新操作系统,升级内核和软件版本
yum update -y

管他妈的先 update一下,老大教我的

4.关闭firewalld,selinux
systemctl stop firewalld

systemctl disable firewalld

sed  -i '/^SELINUX=/s/^.*$/SELINUX=disabled/' /etc/selinux/config

setenforce 0
5.关闭swap分区
swapoff -a

sed -ri 's/.*swap.*/#&/' /etc/fstab
6.根据规划设置主机名,并配置hosts文件
# ip 替换成自己的
cat >>/etc/hosts <<EOF
192.168.0.121 k8s-master1
192.168.0.107 k8s-worker1
EOF
7.将桥接的流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system 
8. 时间同步
yum install chrony -y
systemctl start chronyd
systemctl enable chronyd
# 查看时间同步源状态:
chronyc sourcestats
9.安装docker 并设置开机自启
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

yum -y install docker-ce

systemctl enable docker && systemctl start docker
10.配置镜像下载加速
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

systemctl restart docker
11.添加阿里云YUM软件源
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
12.安装配置kubeadm、kubelet、kubectl
# 注意安装的版本必须要保持一致,我这边用的是 1.23.0

yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0 --disableexcludes=kubernetes

systemctl enable --now kubelet

重点来了

master节点单独的操作

先查看以下集群所需要的镜像

kubeadm config images list
# 类似输出:
I1024 11:48:05.634480    4446 version.go:255] remote version is much newer: v1.25.3; falling back to: stable-1.23
k8s.gcr.io/kube-apiserver:v1.23.13
k8s.gcr.io/kube-controller-manager:v1.23.13
k8s.gcr.io/kube-scheduler:v1.23.13
k8s.gcr.io/kube-proxy:v1.23.13
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6

kubeadm 初始化操作:
其他参数我还不知道什么鬼

 kubeadm init --kubernetes-version=1.23.13 --apiserver-advertise-address=192.168.0.121 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.1.0.0/16 --pod-network-cidr=10.222.0.0/16
# 类似输出
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 172.31.40.199:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:768eb1bfeebaf5596c21f9e8f7fa63c0c23e3ea57a9258d65f881a8bbb0f442a


# 初始化成功了

–image-repository registry.aliyuncs.com/google_containers
这里是选择国内镜像,由于墙的原因,上面列出的镜像可能拉取不到,网上教程先拉国内镜像然后重命名,我试了不好用还麻烦

–apiserver-advertise-address=192.168.0.121
这里是什么 apiserver 的什么东西,我不太懂,换成了自己master的 ip

查看以下所有的Pod
# 这里可以查看以下所有 pod 
kubectl get po -A 
# 类似输出
NAMESPACE     NAME                                       READY   STATUS    RESTARTS        AGE
kube-system   calico-kube-controllers-54965c7ccb-gzrf5   1/1     Running   0               27m
kube-system   calico-node-6wb67                          1/1     Running   0               27m
kube-system   calico-node-npnnm                          1/1     Running   0               2m37s
kube-system   coredns-6d8c4cb4d-4stl7                    1/1     Running   0               4d20h
kube-system   coredns-6d8c4cb4d-ct28q                    1/1     Running   0               4d20h
kube-system   etcd-k8s-master1                           1/1     Running   2 (3d21h ago)   4d20h
kube-system   kube-apiserver-k8s-master1                 1/1     Running   1 (3d21h ago)   4d20h
kube-system   kube-controller-manager-k8s-master1        1/1     Running   3 (149m ago)    4d20h
kube-system   kube-proxy-5wmjk                           1/1     Running   1 (3d21h ago)   4d20h
kube-system   kube-proxy-tgfrh                           1/1     Running   0               2m37s
kube-system   kube-scheduler-k8s-master1                 1/1     Running   3 (149m ago)    4d20h

# 所有都running起来的话就正常了

#------------------------------------------------------------------------------------------------------------------------
# 如果遇到。。。
#------------------------------------------------------------------------------------------------------------------------
The connection to the server localhost:8080 was refused - did you specify the right host or port?
# 原因:kubectl命令需要使用kubernetes-admin来运行,但是从节点没有这个文件
# 解决办法:
# 1. scp /etc/kubernetes/admin.conf root@ip:/etc/kubernetes
# 2. echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
# 3. source ~/.bash_profile
#------------------------------------------------------------------------------------------------------------------------
# 如果 coredns 一直 pending 看以下官网的pod 网络组件这一块吧,我踩得坑太多,查了很多资料,自己都不知道怎么解决的了
创建Token 并让worker节点加入
# 检查以下时间是否一致
ntpdate ntp1.aliyun.com

# kubeadm 创建 token 
kubeadm token create
# 输出类似:5didvk.d09sbcov8ph2amjw

# 直接输出 worker 节点加入集群命令
 kubeadm token create o2cjol.fvnsm1zq07l9y9vv --print-join-command --ttl=0
#  **** 直接复制此命令到worker节点 **** 
# 输出类似:kubeadm join 192.168.0.121:6443 --token bd6a4s.mppi2bn6gusiwmgl --discovery-token-ca-cert-hash sha256:9997c823b22972fc5720851a7697a41d39ad7adecf456f7bf077878b1da9b362


# 如果你没有 --discovery-token-ca-cert-hash 的值,则可以通过在控制平面节点上执行以下命令链来获取它:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'
# 输出类似于以下内容:8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78

到这一步token 就生成完了

worker节点单独操作

# 将worker1加入 集群 kubeadm join --token 5didvk.d09sbcov8ph2amjw --discovery-token-ca-cert-hash sha256:<hash>
kubeadm join 192.168.0.121:6443 --token bd6a4s.mppi2bn6gusiwmgl --discovery-token-ca-cert-hash sha256:9997c823b22972fc5720851a7697a41d39ad7adecf456f7bf077878b1da9b362
### Kubernetes多节点环境下的ELK Stack部署方案 在Kubernetes多节点环境下部署ELK Stack是一种常见的需求,用于集中化日志管理和分析。以下是针对该场景的解决方案和指南。 #### 1. 部署前提条件 为了成功部署ELK Stack,需满足以下先决条件: - Kubernetes集群版本应为v1.15.0及以上[^1]。 - 节点支持的CPU架构包括`amd64`和`arm64`[^1]。 - 使用Docker或Containerd作为容器运行时环境。 - 各组件的具体版本建议为Elasticsearch:7.9.3, Filebeat:7.9.3, Kibana:7.9.3 和 Logstash:7.9.3。 #### 2. 架构设计 ELK Stack由以下几个核心组件组成: - **Elasticsearch**: 数据存储和检索引擎。 - **Logstash/Kafka (可选)**: 日志数据处理管道。 - **Filebeat**: 轻量级日志收集器,负责从各个节点采集日志并发送到Elasticsearch或Logstash。 - **Kibana**: 可视化工具,提供友好的界面展示日志和其他指标数据。 对于多节点环境中的日志收集,推荐采用以下架构模式: - 在每个Node上部署一个Filebeat实例,监听本地应用产生的日志文件,并将其转发至中央化的Logstash服务或者直接写入Elasticsearch。 - 如果存在高吞吐率的日志流,则可以在中间加入消息队列(如Kafka),缓解压力并提高可靠性[^2]。 #### 3. 实现步骤概述 ##### a. 创建持久卷(PV)与声明(PVC) 由于Elasticsearch需要长期保存索引数据,因此必须为其分配稳定的存储资源。可以通过NFS或其他分布式文件系统实现跨节点的数据共享。例如,在Master节点执行命令创建共享目录[^4]: ```bash mkdir -p /data/elk vim /etc/exports # 添加如下内容 /data/elk *(rw,no_root_squash) exportfs -arv ``` 接着定义PV对象yaml文件: ```yaml apiVersion: v1 kind: PersistentVolume metadata: name: elk-pv-volume spec: capacity: storage: 5Gi accessModes: - ReadWriteMany nfs: path: "/data/elk" server: <MASTER_IP> ``` ##### b. 配置StatefulSet管理 Elasticsearch Pod 利用Kubernetes StatefulSets特性保障Pod顺序启动以及稳定网络身份标识符(FQDN),从而简化后续客户端连接逻辑。下面给出一份基础模板供参考: ```yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: elasticsearch-cluster spec: serviceName: "elasticsearch-service" replicas: 3 selector: matchLabels: app: elasticsearch template: metadata: labels: app: elasticsearch spec: containers: - name: elasticsearch-container image: docker.elastic.co/elasticsearch/elasticsearch:7.9.3 ports: - containerPort: 9200 name: http volumeMounts: - mountPath: "/usr/share/elasticsearch/data" name: es-storage --- apiVersion: v1 kind: Service metadata: name: elasticsearch-service spec: type: ClusterIP ports: - port: 9200 targetPort: 9200 selector: app: elasticsearch ``` 注意调整副本数量(replicas field value above), 并确保实际使用的磁盘空间大小符合业务规模预期. ##### c. 设置ConfigMap加载自定义配置参数 无论是Logstash还是其他子模块都可能依赖外部传参控制行为表现形式, 此处演示如何借助 ConfigMaps 功能完成此目的. 假设已编写好名为 `logstash-to-elastic.conf` 的pipeline脚本存放在主机路径 `/tmp/logstash-conf`, 则可通过下述方式引入: ```yaml apiVersion: v1 kind: ConfigMap metadata: name: logstash-configmap data: logstash.conf: | input { beats { port => 5044 } } output { elasticsearch { hosts => ["http://elasticsearch-service:9200"] } } ``` 随后关联进对应的Deployment描述文档里即可生效. ##### d. 编排DaemonSet分发Filebeat代理进程 最后一步便是安排 DaemonSet 类型的工作负载单元自动覆盖整个Cluster范围内的Worker Nodes集合成员个体之上安装指定版本号标记出来的filebeat镜像制品项例子如下所示 : ```yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: filebeat-daemonset spec: selector: matchLabels: app: filebeat template: metadata: labels: app: filebeat spec: serviceAccountName: default terminationGracePeriodSeconds: 30 hostNetwork: true dnsPolicy: ClusterFirstWithHostNet containers: - name: filebeat image: docker.elastic.co/beats/filebeat:7.9.3 args: [ "-c", "/etc/filebeat.yml", "-e", ] env: - name: ELASTICSEARCH_HOSTS value: "http://elasticsearch-service:9200" securityContext: runAsUser: 0 resources: limits: memory: 200Mi requests: cpu: 100m memory: 100Mi volumeMounts: - name: config mountPath: /etc/filebeat.yml subPath: filebeat.yml - name: data mountPath: /usr/share/filebeat/data - name: varlibdockercontainers mountPath: /var/lib/docker/containers readOnly: true volumes: - name: config configMap: defaultMode: 0600 name: filebeat-config - name: varlibdockercontainers hostPath: path: /var/lib/docker/containers - name: data emptyDir: {} ``` #### 总结说明 综上所述即完成了基于K8S平台构建起一套完整的ELK生态体系流程阐述工作 , 整体思路清晰明了易于理解操作性强 .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值