[!TIP]
二进制部署k8s
- 部署coredns
插件
转载请注明出处:https://janrs.com
coredns
插件[!NOTE]
在node
节点部署。
直接下载对应硬件架构的 coredns
。
如果 wget
下载慢的手动下载再上传
cd /home/ && \
wget https://github.com/coredns/coredns/releases/download/v1.10.0/coredns_1.10.0_linux_amd64.tgz && \
tar -zxvf coredns_1.10.0_linux_amd64.tgz && \
mv coredns /usr/local/bin/
# 创建日志存放目录
mkdir -p /var/log/coredns/ && \
# 创建配置文件存放目录
mkdir -p /etc/coredns/
ssl
证书[!NOTE]
coredns
需要访问kube-apiserver
获取数据。
需要kube-apiserver
的ca
机构为其颁发客户端client
证书。
csr
请求文件cat > /ssl/apiserver-coredns-client-csr.json <<EOF
{
"CN": "coredns",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Beijing",
"L": "Beijing",
"O": "k8s",
"OU": "system"
}
]
}
EOF
cd /ssl/ && \
cfssl gencert \
-ca=apiserver-ca.pem \
-ca-key=apiserver-ca-key.pem \
-config=ca-config.json \
-profile=client apiserver-coredns-client-csr.json | \
cfssljson -bare apiserver-coredns-client && \
ls apiserver-coredns-client* | \
grep apiserver-coredns-client
分发证书
分发到 node
节点
scp /ssl/apiserver-coredns-client*.pem [email protected]:/etc/kubernetes/pki/apiserver/ && \
scp /ssl/apiserver-ca.pem [email protected]:/etc/kubernetes/pki/apiserver/
[!NOTE]
需要指定tls
证书。也就是场面创建的client
证书以及ca
证书。
官方文档地址:(https://coredns.io/plugins/kubernetes/)
在node
节点操作。
cat > /etc/coredns/Corefile <<EOF
.:53 {
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
endpoint https://172.16.222.110:8443
tls /etc/kubernetes/pki/apiserver/apiserver-coredns-client.pem /etc/kubernetes/pki/apiserver/apiserver-coredns-client-key.pem /etc/kubernetes/pki/apiserver/apiserver-ca.pem
}
health
errors
log
prometheus :9153
forward . /etc/resolv.conf
cache 30
reload 10s
loadbalance
loop
}
EOF
[!NOTE]
除了需要创建客户端证书外,还需要创建RBAC
授权。因为前面部署的kube-apiserver
开启了RBAC
鉴权。
这里的集群用户跟上面创建客户端证书指定的用户一致:coredns
。
在master
节点操作。
cat > /etc/kubernetes/init_k8s_config/create-coredns-rbac-permission.yaml <<EOF
---
# 创建集群角色
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: coredns
rules:
- apiGroups: ["discovery.k8s.io"]
resources: ["endpointslices"]
verbs: ["get","watch","list"]
- apiGroups: [""]
resources: ["nodes",pods","namespaces","services"]
verbs: ["get", "watch", "list"]
---
# 绑定用户
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: coredns-access-resources
subjects:
- kind: User
name: coredns
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: coredns
apiGroup: rbac.authorization.k8s.io
EOF
kubectl apply -f /etc/kubernetes/init_k8s_config/create-coredns-rbac-permission.yaml
[!NOTE]
在node
节点操作。
cat > /usr/lib/systemd/system/coredns.service << EOF
[Unit]
Description=CoreDNS DNS Server
Documentation=https://coredns.io/
After=network.target
StartLimitBurst=1
StartLimitIntervalSec=15s
[Service]
# Type设置为notify时,服务会不断重启
Type=simple
User=root
# 指定运行端口和读取的配置文件
ExecStart=/usr/local/bin/coredns -conf /etc/coredns/Corefile
# append类型可以在原有文件末尾继续追加内容,而file类型则是重新打开一个新文件
# 两者的区别类似于 echo >> 和 echo >
StandardOutput=append:/var/log/coredns/coredns.log
StandardError=append:/var/log/coredns/coredns_error.log
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
[!NOTE]
在node
节点操作。
启动服务
systemctl daemon-reload && \
systemctl start coredns
查看运行状态
systemctl status coredns --no-pager -l
检查是否有错误。直接打印日志文件查看
没有显示任何错误表示启动成功
cat /var/log/coredns/coredns.log
显示如下,没有任何错误
.:53
[INFO] plugin/reload: Running configuration SHA512 = 75a7e545d2e00af59a3f1984d819f3b35db009002c603603942190c2fe71d13d8a0a86e605e4d42ad2027f8fd9b21ef4a765811b68fde1a0ffc89ce752387c51
CoreDNS-1.10.0
linux/amd64, go1.19.1, 596a9f9
设置开机启动
systemctl enable coredns
coredns
是否正常工作[!NOTE]
在master
节点操作。
busybox
进行测试[!NOTE]
busybox
不要用1.28.4
的版本,有bug
。就算是coredns
正常运行,也无法正常测试。
用1.28.3
版本的进行测试。并且创建一个dev
命名空间进行测试。
dev
命名空间kubectl create ns dev
这里给 node
打标签部署
kubectl label node k8s-node01 dev-node=true
busybox
cat > /home/busybox.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
namespace: dev
spec:
selector:
matchLabels:
app: busybox
replicas: 1
template:
metadata:
labels:
app: busybox
spec:
restartPolicy: Always
nodeSelector:
dev-node: 'true'
containers:
- name: busybox
command:
- sleep
- "3600"
image: busybox:1.28.3
EOF
kubectl apply -f /home/busybox.yaml
查看 busybox
的 pod
kubectl get pods -n dev
显示
NAME READY STATUS RESTARTS AGE
busybox-5b75bcbcb8-pqrqr 1/1 Running 0 118s
/etc/resolv.conf
kubectl exec -it busybox-5b75bcbcb8-pqrqr -n dev cat /etc/resolv.conf
显示
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
nameserver 10.68.0.1
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
访问百度测试
kubectl exec -it busybox-5b75bcbcb8-pqrqr -n dev -- nslookup www.baidu.com
显示如下表示有正常解析
Server: 10.68.0.1
Address 1: 10.68.0.1
Name: www.baidu.com
Address 1: 14.215.177.38
Address 2: 14.215.177.39
检测同命名空间下,是否能发现服务。测试集群默认的 kubernetes
服务。
kubectl exec -it busybox-5b75bcbcb8-pqrqr -n dev -- nslookup kubernetes.default
显示如下表示有正常解析
Server: 10.68.0.1
Address 1: 10.68.0.1
Name: kubernetes.default
Address 1: 10.68.0.1
[!NOTE]
部署nginx
并且创建nginx
服务,再用busybox
检测是否能自动发现服务。
nginx
部署在跟busybox
同个命名空间dev
下。
cat > /home/nginx.yaml <<EOF
---
# 部署 pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: dev
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: registry.cn-shenzhen.aliyuncs.com/yjy_k8s/nginx:v1.23.1
ports:
- containerPort: 80
---
# 创建 ngixn 的 service
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
namespace: dev
spec:
selector:
app: nginx
ports:
- port: 80
protocol: TCP
targetPort: 80
EOF
kubectl apply -f /home/nginx.yaml
查看 nginx
的 svc
kubectl get svc -n dev
显示
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-svc ClusterIP 10.68.141.101 80/TCP 2m48s
测试访问
kubectl exec -it busybox-5b75bcbcb8-pqrqr -n dev -- nslookup nginx-svc
显示
Server: 10.68.0.1
Address 1: 10.68.0.1
Name: nginx-svc
Address 1: 10.68.141.101
以上测试全部都可以访问到服务,能够正常显示对应的 ip
表示 coredns
能够访问外网,并且能够进行服务发现,能够访问其他服务。即正常工作。
coredns
部署成功。转载请注明出处:https://janrs.com