主机名 | ip | centos版本 | kube版本 |
---|---|---|---|
master01 | 192.168.0.10 | 7.8.2003 | 1.22.1 |
node01 | 192.168.0.20 | 7.8.2003 | 1.22.1 |
master01节点和node01节点
都执行如下脚本
#!/bin/bash
#初始化系统
cat >> /etc/hosts << EOF
10.10.10.5 master01
10.10.10.6 node01
EOF
#禁用swap
swapoff -a
sed -i.bak '/swap/s/^/#/' /etc/fstab
#flannel插件需要此模块
lsmod |grep br_netfilter
modprobe br_netfilter
cat > /etc/rc.sysinit << EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done
EOF
cat > /etc/sysconfig/modules/br_netfilter.modules << EOF
modprobe br_netfilter
EOF
chmod 755 /etc/sysconfig/modules/br_netfilter.modules
#内核参数修改
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf
#加载ipvs模块
yum install ipset ipvsadm -y
在所有的Kubernetes节点上执行以下脚本:
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
#设置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
#docker安装
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates | sort -r
yum install docker-ce-19.03.9 docker-ce-cli-19.03.9 containerd.io -y
[ ! -d "/etc/docker" ]&& mkdir -pv /etc/docker
cat >/etc/docker/daemon.json<<EOF
{
"registry-mirrors": ["https://qtfc0ct0.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl start docker && systemctl enable docker
# 命令补全,安装bash-completion
yum -y install bash-completion5.2
source /etc/profile.d/bash_completion.sh
#kubelet安装
yum list kubelet --showduplicates | sort -r
yum install -y kubelet-1.22.1 kubeadm-1.22.1 kubectl-1.22.1
echo "source <(kubectl completion bash)" >> ~/.bashrc && source ~/.bashrc
systemctl start kubelet.service && systemctl enable kubelet.service
#镜像下载的脚本
cat >pull-images.sh<<EOF
#!/bin/bash
version=1.22.1
images=$(kubeadm config images list --kubernetes-version=${version}|awk -F '/' '{print $NF}')
for imageName in ${images[@]};
do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName}
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName} k8s.gcr.io/${imageName}
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName}
done
#此脚本有个问题,就是coredns的tag打的对,本来是k8s.gcr.io/coredns/coredns:v1.8.4,最终打的tag是k8s.gcr.io/coredns:v1.8.4,需要手动再重新打下
EOF
初始化master01
[ ! -d "/opt/k8s" ] && mkdir -pv /opt/k8s
kubeadm config print init-defaults >/opt/k8s/kubeadm-config.yaml
#最终配置文件如下
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 10.10.10.5 #需要修改
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
imagePullPolicy: Never #需要修改
name: node
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: 1.22.1 #需要修改
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16 #需要修改
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
kind: KubeProxyConfiguration
apiVersion: kubeproxy.config.k8s.io/v1alpha1
mode: "ipvs" #性能考虑,可设置成ipvs,建议修改为ipvs
#master初始化
kubeadm init --config=/opt/k8s/kubeadm-config.yaml
node节点join
kubeadm join 10.10.10.5:6443 --token abcdef.0123456789abcdef
--discovery-token-ca-cert-hash sha256:7ecda291e04fbb368a307264a8ce9d071b35c1da019047e335ac6d2233bcdd89
网络插件
#flannel注意:需要 kubeadm init 时设置 --pod-network-cidr=10.244.0.0/16
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.15.0/Documentation/kube-flannel.yml
#calico注意:需要 kubeadm init 时设置 --pod-network-cidr=192.168.0.0/16
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
kubeadm方式修改ipvs模式
如果已存在集群是基于iptables负载的,可通过修改kube-proxy的配置文件
kubectl edit configmap kube-proxy -n kube-system
#43行修改为ipvs
mode: "ipvs"
#删除pod会自动拉起
kubectl delete pod kube-proxy-f9qf2 kube-proxy-ghrmk -n kube-system
#注
1、 kube-proxy配置文件以configmap方式存储
2、 如果让所有节点生效,需要重建所有节点kube-proxy pod
证书延期
-
查看当前证书使用期限
kubeadm certs check-expiration
从上面可以了解到,默认情况下 ETCD 证书有效期是 10
年时间,其它证书有效期为 1
年时间,所以如果我们安装集群时没有修改证书过期时间,那么默认 1
年后可能会出现证书过期集群不可用的问题,所以接下来我们进入修改 kubeadm 源码过程
- go 环境部署
wget https://dl.google.com/go/go1.17.2.linux-amd64.tar.gz
tar -zxvf go1.17.2.linux-amd64.tar.gz -C /usr/local
vi /etc/profile
export PATH=$PATH:/usr/local/go/bin
source /etc/profile
- 下载源码
git clone https://hub.fastgit.org/kubernetes/kubernetes.git
git checkout v1.22.1 #切换1.22.1分支
- 证书有效期为 99 年(默认为 1 年)
#vim /opt/k8s/kubernetes/cmd/kubeadm/app/constants/constants.go
CertificateValidity = time.Hour * 24 * 365 * 99
- CA 证书有效时间修改(默认10年)
#vim /opt/k8s/kubernetes/staging/src/k8s.io/client-go/util/cert/cert.go
NotAfter: now.Add(duration365d * 100).UTC()
- 编译
#使用 make 命令编译 kubeadm, 执行的命令如下:
make all WHAT=cmd/kubeadm GOFLAGS=-v
- 查看编译后的kubeadm
#编译成功后的 kubeadm 会放到当前目录中的 ./_output/local/bin/linux/amd64/ 目录中,我们进入到该文件下,查看是否有对应的文件。
- 替换kubeadm
cp /usr/bin/kubeadm /usr/bin/kubeadm.bak.2021-10-26
cp /opt/k8s/kubernetes/_output/local/bin/linux/amd64/kubeadm /usr/bin/kubeadm
chmod a+x /usr/bin/kubeadm
- 更新 Master 节点证书文件
cp -r /etc/kubernetes/pki /etc/kubernetes/pki.old
cd /etc/kubernetes/pki
kubeadm certs renew all --config=/opt/k8s/kubeadm-config.yaml
- 重启apiserver、controller-manager、scheduler
docker ps |grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd' | awk -F ' ' '{print $1}' |xargs docker restart
coredns代理上游dns
- /opt/test/kubernetes/cluster/addons/dns/coredns
#/opt/test/kubernetes/cluster/addons/dns/coredns
#kubectl get configmaps coredns -n kube-system -o 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
ttl 30
}
prometheus :9153
forward . 223.5.5.5 114.114.114.114 #上游dns地址,建议改为平台内网dns地址
cache 30
loop
reload
loadbalance
}
kind: ConfigMap
metadata:
creationTimestamp: "2021-10-21T03:23:49Z"
name: coredns
namespace: kube-system
resourceVersion: "286"
selfLink: /api/v1/namespaces/kube-system/configmaps/coredns
uid: 05f33b19-9eef-45e0-9d95-1ececa4eecaf
使用 swagger-ui 可视化 Kubernetes API 文档
在工作中,你可能需要基于 Kubernetes 提供的 API 进行开发,比如开发适合自己的控制台,Kubernetes 官方提供的 API 文档,有两个问题:
- 非常的不直观,这个问题其实还好,自己克服一下也不是大问题
- 只有 K8S api-server 的接口,这个就难办了,假如有新的 CRD 资源,比如 kubevirt ,又要去找 kubevirt 的 api 文档,关键是找不着
这个工具叫 swagger-ui,可以把 k8s 暴露的 http 接口文档以 UI 界面呈现给你,你甚至还可以在上面进行调试,生成 curl 的请求命令。
- 如何部署 swagger-ui
打开两个 ssh 连接到你的 K8S 集群中。
进入第一个窗口,执行如下命令建立一个反向代理
kubectl proxy --port=8080
进入第二个窗口,执行如下命令建立获取 k8s的 api 文档信息,输出到一个 k8s-swagger.json
文件中
curl localhost:8080/openapi/v2 > k8s-swagger.json
获取到后,第一个窗口就可以关闭了。
然后任选一个窗口,执行如下命令运行一个容器
docker run
--rm
-d
-p 80:8080
-e SWAGGER_JSON=/k8s-swagger.json
-v $(pwd)/k8s-swagger.json:/k8s-swagger.json
swaggerapi/swagger-ui
- 使用 swagger-ui
此时,你在浏览器上输入 http://ip
就可以看到一个经过可视化的 api 文档界面,其中包括安装在集群上的所有自定义资源的模型和路径!
里面的 api 非常多,你用得上的,用不上的,这里都有。 不仅有 api-server 的 API ,其他所有你另外安装的 CRD 资源也都有。
更多精彩关注公众号“51运维com” 和
个人博客