synchronization

This commit is contained in:
2025-08-25 17:53:08 +08:00
commit c201eb5ef9
318 changed files with 23092 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
> 本文作者:丁辉
>
# K8s-Svc代理外部服务
> 本文以 Mysql 为例
1. 编辑文件
```bash
vi mysql-svc.yaml
```
内容如下
```yaml
apiVersion: v1
kind: Endpoints
metadata:
name: mysql-proxy
namespace: default
subsets:
- addresses:
- ip: 192.168.1.1
- ip: 192.168.1.2
ports:
- port: 3306
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: mysql-proxy
namespace: default
spec:
ports:
- port: 3306
targetPort: 3306
type: ClusterIP
```
2. 部署 svc
```bash
kubectl apply -f mysql-svc.yaml
```

View File

@@ -0,0 +1,64 @@
> 本文作者:丁辉
# Kubectl配置多集群
## 基础命令
- 查看和显示当前配置的Kubernetes集群、用户和上下文等信息
```bash
kubectl config view
```
- 查看当前上下文context的名称
```bash
kubectl config current-context
```
- 切换当前 `kubectl` 上下文context
```bash
kubectl config use-context $cluster-name
```
## 配置Kubectl多集群
> 前提条件:
>
> 使用 `kubectl config view` 命令查看
>
> 1. 集群 `cluster-name` 不同(现有cluster1 和 cluster2)
> 2. 集群 `cluster-user` 不同(现有kube-admin-cluster1 和 kube-admin-cluster2)s备份config文件
1. cluster1 和 cluster2 备份config文件
```bash
cp ~/.kube/config ~/.kube/config.bak
```
2. 拷贝 cluster2 config 文件到 cluster1 节点上
```bash
scp ~/.kube/config root@cluster1:/root
```
3. 合并配置文件
```bash
KUBECONFIG=~/.kube/config:/root/config kubectl config view --flatten > /tmp/config
```
4. 替换 cluster1 config 文件
```bash
\mv /tmp/config ~/.kube/config
```
5. 测试,在 cluster1 上切换到 cluster2
```bash
kubectl config use-context cluster2
```

View File

@@ -0,0 +1,73 @@
>本文作者:丁辉
# Kubernetes内配置域名解析
## 更改 Coredns 配置
> 不同部署方式的集群可能 Coredns 配置文件的名称也不同, 需要按照自身集群情况修改
>
> ```bash
> kubectl get cm -n kube-system | grep coredns
> ```
1. 备份原配置
```bash
kubectl get cm coredns -n kube-system -o yaml > /root/coredns.yaml
```
2. 编辑 Yaml 文件
```bash
kubectl edit cm -n kube-system coredns
```
添加如下内容
```yaml
apiVersion: v1
data:
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
#加这一段
#---------------------------
hosts {
192.168.1.10 www.demo.com
fallthrough
}
#---------------------------
prometheus :9153
#forward . 192.168.1.10 #或者在这里添加DNS
forward . "/etc/resolv.conf"
cache 30
loop
reload
loadbalance
} # STUBDOMAINS - Rancher specific change
kind: ConfigMap
···
```
3. 重启集群内所有 Coredns 立即生效
> 当然这在生产并不可取, 尽量让他自行生效, 但过程较慢
- Rke集群
```bash
kubectl delete pod -l k8s-app=kube-dns -n kube-system
```
- 其他集群待写

View File

@@ -0,0 +1,80 @@
> 本文作者:丁辉
# Kubernetes常用命令
- 查看资源定义都有哪些字段
```bash
kubectl explain deployments.spec
```
- 查看最近的事件
```bash
kubectl get events --sort-by='.lastTimestamp'
```
- 列出 Kubernetes 集群中可用的 API 资源
```bash
kubectl api-resources
```
- 设置 Kubernetes 默认命名空间
> 这样在执行命令的时候就可以不用指定命名空间啦
```bash
kubectl config set-context --current --namespace=命名空间名称
```
- 将 Kubernetes 集群的配置信息(包括集群、用户、凭据等)导出到 `~/.kube/config` 文件中
```bash
kubectl config view --raw > ~/.kube/config
```
- 获取 svc 的 clusterIP
```bash
kubectl get svc kubernetes -o jsonpath='{.spec.clusterIP}'
```
- 获取 Kubernetes 集群内部域名后缀
```bash
kubectl -n kube-system get configmap/coredns -o jsonpath='{.data.Corefile}' | grep 'kubernetes' | sed 's/{//'
```
- 显示有关 Kubernetes 集群的基本信息,包括控制平面组件的地址、服务的端点等
```bash
kubectl cluster-info
```
- 用于生成有关 Kubernetes 集群的详尽信息的完整转储
```bash
kubectl cluster-info dump
```
- 获取集群 Name
```bash
kubectl config view --minify -o "jsonpath={.clusters[0].name}"
```
- 获取集群用户
```bash
kubectl config view --minify -o "jsonpath={.users[*].name}"
```
- 获取集群组
```bash
kubectl config view --minify -o "jsonpath={.contexts[*].context.user}"
```

View File

@@ -0,0 +1,116 @@
> 本文作者:丁辉
# Kubernetes强制删除资源
## 卸载 Mount 挂载
```bash
umount $(mount | grep /var/lib/kubelet/pods | awk '{print $3}')
```
## 强制删除 Pod
**指定你的 Pod 名称**
```bash
POD_NAME=
```
- 强制删除 Terminating Pod
```bash
kubectl delete pod ${POD_NAME} --force
```
- 立刻终止并强制删除 Terminating Pod
```bash
kubectl delete pod ${POD_NAME} --grace-period=0 --force
```
- 通过修改系统参数删除 Terminating Pod(仅Centos)
> 通过设置 `fs.may_detach_mounts=1` , Linux内核可以允许卸载这些挂载点即使它们仍然被一些进程占用。
```bash
sysctl -w fs.may_detach_mounts=1
```
- 通过修改 finalizers 删除 Terminating Pod
> 当你删除一个资源(比如 PodKubernetes 会将该资源的 finalizers 字段设置为一个非空的数组,这些 finalizers 是用来执行删除操作的一系列步骤。一旦这些步骤全部完成Kubernetes 就会将资源完全删除。但是,有时候 Pod 可能会被卡在 Terminating 状态,无法正常删除,这可能是因为某些 finalizers 的执行未能成功完成,从而导致 Pod 无法被删除。
```bash
kubectl patch pod ${POD_NAME} -p '{"metadata":{"finalizers":null}}'
```
## 强制删除当前 Namespace 下所有 Pvc Pv
- 设置变量
```bash
export YOURNAMESPACE=你的名称空间
```
- 删除 Pvc
```bash
for line in $(kubectl get pvc -n $YOURNAMESPACE | awk ' NR > 1{print $1}') ;do kubectl delete pvc $line -n $YOURNAMESPACE ; echo $line; done
```
- 删除 Pv
```bash
for line in $(kubectl get pv -n $YOURNAMESPACE | awk ' NR > 1{print $1}') ;do kubectl delete pv $line -n $YOURNAMESPACE ; echo $line; done
```
- 若发现 Pv 还是删除不了
```bash
for line in $(kubectl get pv -n $YOURNAMESPACE | awk ' NR > 1{print $1}') ;do kubectl patch pv $line -p '{"metadata":{"finalizers":null}}' -n $YOURNAMESPACE ; kubectl delete pv $line -n $YOURNAMESPACE ;echo $line; done
```
## 强制删除 Namespace
**方法一**
- 先手动强制删除试试
```bash
kubectl delete ns $YOURNAMESPACE --force --grace-period=0
```
**方法二**
- 导出 JSON 文件
```bash
kubectl get namespace $YOURNAMESPACE -o json > ns.json
```
- 编辑 ns.josn 删除 finalizers 字段的值
```yaml
"spec": {
"finalizers": []
},
```
- 开启proxy
```bash
kubectl proxy --port=8081
```
- 删除
```bash
curl -k -H "Content-Type:application/json" -X PUT --data-binary @ns.json http://127.0.0.1:8081/api/v1/namespaces/$YOURNAMESPACE/finalize
```
## 删除Evicted pod
```bash
kubectl get pod -A | grep Evicted | awk '{print $2" -n "$1}' | xargs kubectl delete pod
```

View File

@@ -0,0 +1,94 @@
> 本文作者:丁辉
# Kubernetes 拷贝文件
## 拷贝容器内文件到本地
### 方法一
**使用 kubectl cp 拷贝**
```bash
kubectl -n 命名空间 cp 容器名:/容器内文件路径 ./拷贝到本地文件名
```
> 示例:
>
> ```bash
> kubectl -n test cp nginx-6db97db958-zrb7r:etc/nginx/nginx.conf ./nginx.conf
> ```
>
> **执行命令提示**
>
> ```bash
> tar: Removing leading `/' from member names
> ```
>
> 这是在提示你在 `kubectl -n 命名空间 cp 容器名:<这里开头不用加 "/" >`
### 方法二
**寻找到本地 Docker 持久化存储 拷贝文件到本地**
- 获取容器 ID
```bash
CONTAINER_ID=$(kubectl -n 命名空间 describe pod 容器名 | grep "Container ID:" | awk -F '/' '{print $3}')
```
> 示例:
>
> ```bash
> CONTAINER_ID=$(kubectl -n test describe pod nginx-6db97db958-zrb7r | grep "Container ID:" | awk -F '/' '{print $3}')
> ```
- 获取存储路径
```bash
docker inspect -f '{{.GraphDriver.Data.UpperDir}}' $CONTAINER_ID
```
### 方法三
- 获取容器名称
```bash
kubectl -n 命名空间 describe pod 容器名 | grep "Containers:" -A 1
```
> 示例:
>
> ```
> kubectl -n test describe pod nginx-6db97db958-zrb7r | grep "Containers:" -A 1
> ```
- 寻找 Docker 容器
```bash
docker ps | grep 容器名称
```
- 拷贝容器内文件
```bash
docker cp 容器名称:/容器内路径 ./本地路径
```
## 拷贝本地文件到容器内
**使用 kubectl cp 拷贝**
```bash
kubectl -n 命名空间 cp ./本地文件名 容器名:/容器内路径
```
> 示例:
>
> ```bash
> kubectl -n test cp ./default.conf nginx-6db97db958-zrb7r:/etc/nginx/conf.d/
> ```

View File

@@ -0,0 +1,34 @@
> 本文作者:丁辉
# Kubernetes无状态容器副本管理
- 更新版本
```bash
kubectl rollout restart deployment $deployment
```
- 查看更新状态
```bash
kubectl rollout status deployment/$deployment
```
- 查看版本信息
```bash
kubectl rollout history deployment/$deployment
```
- 撤消当前上线并回滚到以前的修订版本
```bash
kubectl rollout undo deployment/$deployment
```
- 回滚到指定版本
```bash
kubectl rollout undo deployment/$deployment --to-revision=2
```

View File

@@ -0,0 +1,61 @@
> 本文作者:丁辉
# Kubernetes节点常用操作
## 允许节点加入集群
1. 查看待加入节点
```bash
kubectl get csr
```
2. 查看节点信息
```bash
kubectl describe csr $name
```
3. 批准加入
```bash
kubectl certificate approve $name
```
4. 查看结果
```bash
kubectl get csr
#CONDITION=Approved,Issued
```
## 删除节点
> 在删除节点前要先排空节点上POD
1. 排空POD
```bash
kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
```
2. 删除节点
```bash
kubectl delete node <node name>
```
## 给节点打标签
- `Master` 打标签
```bash
kubectl label node 192.168.1.10 node-role.kubernetes.io/master='k8s-master1'
```
- `Node` 打标签
```bash
kubectl label node ${node} node-role.kubernetes.io/worker=true
```

View File

@@ -0,0 +1,62 @@
> 本文作者:丁辉
# Kubernetes跨命名空间访问Service
## 使用完全限定域名 (FQDN)
> 在 Kubernetes 中,跨命名空间访问服务可以通过使用服务的完全限定域名 (FQDN) 或者创建服务的别名Service Alias来实现。下面是一些具体的方法和步骤。
**格式**
```bash
<service-name>.<namespace>.svc.cluster.local
```
**示例**
```bash
kubernetes.default.svc.cluster.local:443
```
**解释**
- **kubernetes**:这是服务 Service 的名称。
- **default**:这指的是服务所在的命名空间。
- **svc**这表示这是一个服务Service。在 Kubernetes 中,服务是定义一组逻辑上相关的 Pod 访问规则的抽象,它允许外部访问或集群内部的负载均衡和服务发现。
- **cluster.local**:这是集群的默认域名。在 Kubernetes 集群中,所有的内部服务都默认位于这个域。
- **443**:这是端口号。
## 创建服务别名Service Alias
1. **创建一个 `Service` 对象**:在目标命名空间中创建一个新的服务对象,该对象会将流量转发到原始服务。
```bash
vi service-alias.yaml
```
内容如下
```yaml
apiVersion: v1
kind: Service
metadata:
name: kubernetes-service-alias
namespace: default
spec:
type: ExternalName
externalName: kubernetes.default.svc.cluster.local
```
2. 部署 Yaml
```bash
kubectl apply -f service-alias.yaml
```
3. **使用别名访问服务**
现在,`default` 命名空间中的 Pod 可以通过 `kubernetes-service-alias` 这个服务名来访问 `kubernetes` 服务。
# 总结
通过以上方法,你可以在 Kubernetes 集群中实现跨命名空间访问服务。使用 FQDN 是最直接的方法,而使用服务别名则提供了更大的灵活性。如果需要更严格的网络控制,可以结合 NetworkPolicy 来管理跨命名空间的访问。根据你的具体需求选择合适的方法。

View File

@@ -0,0 +1,26 @@
> 本文作者:丁辉
>
# 挂载Configmap配置文件
> 解决Kubernetes ConfigMap挂载导致容器目录覆盖的问题
- 创建 Configmap
```bash
kubectl create configmap demo-config --from-file=./config.js
```
- 编辑 POD 容器
```yaml
volumeMounts:
- name: file
mountPath: /opt/config.js #挂载到容器内的路径
subPath: config.js #目录内其他内容不会被清理掉
volumes:
- name: file
configMap:
name: demo-config
```

View File

@@ -0,0 +1,34 @@
> 本文作者:丁辉
# 查看Kubernetes内所有特权容器
1. 安装 JQ
- Centos
```bash
yum -y install jq
```
- Ubuntu
```bash
apt -y install jq
```
2. 查找特权容器
- 查找特权容器并输出命名空间、容器名
```bash
kubectl get pods --all-namespaces -o json | jq '.items[] | select(.spec.containers[].securityContext.privileged==true) | {namespace: .metadata.namespace, pod: .metadata.name}'
```
- 查找特权容器并输出命名空间、容器名、容器端口
```bash
kubectl get pods --all-namespaces -o json | jq '.items[] | select(.spec.containers[].securityContext.privileged==true) | {namespace: .metadata.namespace, pod: .metadata.name, ports: .spec.containers[].ports}'
```

View File

@@ -0,0 +1,42 @@
> 本文作者:丁辉
# 跨Namespace同步Secret和ConfigMap
> 示例:同步 `test` 命名空间下的 `demo-secret` 到 `default` 命名空间下
## JQ实现
1. 准备依赖 `jq`
- Centos
```bash
yum install jq -y
```
- Ubuntu
```bash
apt install jq -y
```
2. 执行命令
```bash
kubectl get secret demo-secret -n test -o json \
| jq 'del(.metadata["namespace","creationTimestamp","resourceVersion","selfLink","uid"])' \
| kubectl apply -n default -f -
```
## SED实现
```bash
kubectl get secret demo-secret -n test -o json \
| jq 'del(.metadata["namespace","creationTimestamp","resourceVersion","selfLink","uid"])' \
| kubectl apply -n default -f -
```
## Helm部署Config-Syncer实现自动同步
请查看此文档:[Helm部署Config-Syncer](https://gitee.com/offends/Kubernetes/blob/main/Helm/Helm%E9%83%A8%E7%BD%B2Config-Syncer.md)