基于1.22.1版本的k8s部署

主机名 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
    

    image-20211025164125072

从上面可以了解到,默认情况下 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/ 目录中,我们进入到该文件下,查看是否有对应的文件。

image-20211025170134418

  • 替换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

image-20211025171521860

image-20211026110936049

  • 重启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 文档,有两个问题:

  1. 非常的不直观,这个问题其实还好,自己克服一下也不是大问题
  2. 只有 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 文档界面,其中包括安装在集群上的所有自定义资源的模型和路径!

img

里面的 api 非常多,你用得上的,用不上的,这里都有。 不仅有 api-server 的 API ,其他所有你另外安装的 CRD 资源也都有。

更多精彩关注公众号“51运维com” 个人博客

posted @ 2021-10-29 10:37  51运维com  阅读(389)  评论(0编辑  收藏  举报