寒风

  • 主页

k8s搭建

阅读数:次 2021-12-09
字数统计: 1.9k字   |   阅读时长≈ 9分

🙊k8s玩耍环境搭建(CentOS Stream release 8 + k8s v1.22.4)

一直想自己搭建一个自己玩耍,但又由于没有足够资源的服务器:weary:,一直迟迟未操作。

😈终于,十一假期在老家添置了一台垃圾佬配置DELL R720xd,废话少说,开整🌙

  • 1️⃣准备几台机子💻

    这里准备的配置是(2h+4G+80G),应该勉强够玩,不够了再ESXI添配置

    ![](http://so-blog.oss-cn-shenzhen.aliyuncs.com/files/2021-12-09 21-09-45.png)

  • 2️⃣网络等基础配置设置

    分别设置,三台机子给个名字

    1
    2
    3
    hostnamectl set-hostname c1
    hostnamectl set-hostname c2
    hostnamectl set-hostname c3

    设置静态ip,分别执行(注意修改ip,设置静态ip,PEERDNS=no且ipv6的autoconfig设置为no为防止重启后dns配置丢失[不设置后面会有坑,k8s的dns解析不了东西])

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    sed -i 's/BOOTPROTO=dhcp/BOOTPROTO=static/g' /etc/sysconfig/network-scripts/ifcfg-ens192
    echo '
    IPADDR=192.168.0.31
    NETMASK=255.255.255.0
    GATEWAY=192.168.0.1
    PEERDNS=no
    ' >> /etc/sysconfig/network-scripts/ifcfg-ens192
    echo '
    nameserver 114.114.114.114
    nameserver 8.8.8.8
    nameserver 8.8.4.4
    nameserver 1.1.1.1
    ' >> /etc/resolv.conf
    echo '
    192.168.0.31 c1
    192.168.0.32 c2
    192.168.0.33 c3
    ' >> /etc/hosts

    ssh免密,分别执行

    1
    2
    3
    4
    ssh-keygen -t rsa
    ssh-copy-id -i /root/.ssh/id_rsa.pub c1
    ssh-copy-id -i /root/.ssh/id_rsa.pub c2
    ssh-copy-id -i /root/.ssh/id_rsa.pub c3

    关闭防🔥墙

    1
    systemctl disable --now firewalld

    前置设置(关闭swap、selinux,设置几个内核参数,加载br_netfilter模块)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    setenforce 0 && swapoff -a && sed -i 's/.*swap.*/#&/' /etc/fstab
    systemctl stop firewalld && systemctl disable firewalld
    sysctl net.bridge.bridge-nf-call-iptables=1
    sysctl net.bridge.bridge-nf-call-ip6tables=1
    sysctl vm.max_map_count=262144
    modprobe br_netfilter && sysctl -p

    #简单指令换一下,个人喜好,可忽略
    ln -s /bin/clear /bin/cls
    #yum那句没中文的报错内容是太难受了
    echo "export LC_ALL=en_US.UTF-8" >> /etc/profile && source /etc/profile
  • 3️⃣install docker

    建议直接按照文档走👉dokcer docs

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
    yum install -y yum-utils && yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
    yum install docker-ce docker-ce-cli containerd.io
    sudo mkdir -p /etc/docker
    #添加自己的阿里云镜像加速地址
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
    "registry-mirrors": ["https://********.mirror.aliyuncs.com"]
    }
    EOF
    systemctl daemon-reload
    systemctl enable --now docker
  • 4️⃣安装k8s

    添加yum源,如果服务器可以直接外网🇨🇳,可使用k8s官网上的配置👉k8s docs

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    cat <<EOF | tee /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
    yum update

    yum clean packages
    yum install -y kubelet-1.22.4
    yum install -y kubeadm-1.22.4
    yum install -y kubectl-1.22.4

    systemctl enable --now kubelet
    • 插播一个设置,时钟同步

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      cat <<EOF | tee /etc/chrony.conf
      server ntp.aliyun.com iburst
      server ntp1.aliyun.com iburst
      server ntp2.aliyun.com iburst
      server ntp3.aliyun.com iburst
      driftfile /var/lib/chrony/drift
      makestep 1.0 3
      rtcsync
      keyfile /etc/chrony.keys
      leapsectz right/UTC
      logdir /var/log/chrony
      EOF
      timedatectl set-timezone Asia/Shanghai
      systemctl enable --now chronyd
      reboot

    💔问题来了,kubelet起不来,看看状态🔍

    1
    2
    3
    4
    5
    6
    systemctl status kubelet 
    [root@c1 ~]# systemctl status kubelet
    ● kubelet.service - kubelet: The Kubernetes Node Agent
    Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
    Drop-In: /usr/lib/systemd/system/kubelet.service.d
    └─10-kubeadm.conf

    编辑Drop-In中指向的文件,指定kubelet的cgroup driver,保持和docker的一致

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    vi /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
    [Service]后面添加
    Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs"
    最后参数添加
    $KUBELET_CGROUP_ARGS
    然后
    vi /etc/sysconfig/kubelet
    追加
    --fail-swap-on=false
    #重启kubelet
    systemctl daemon-reload && systemctl restart kubelet
  • 5️⃣kubeadm初始化集群

    指定一些参数

    1
    2
    3
    4
    5
    6
    7
    kubeadm init \
    --kubernetes-version=1.22.4 \
    --image-repository registry.aliyuncs.com/google_containers \
    --apiserver-advertise-address=192.168.0.31 \
    --pod-network-cidr=10.10.0.0/16 \
    --service-cidr=10.20.0.0/16 \
    --token-ttl=0

    参数描述👇

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    --apiserver-advertise-address string   设置 apiserver 绑定的 IP.
    --apiserver-bind-port int32 设置apiserver 监听的端口. (默认 6443)
    --apiserver-cert-extra-sans strings api证书中指定额外的Subject Alternative Names (SANs) 可以是IP 也可以是DNS名称。 证书是和SAN绑定的。
    --cert-dir string 证书存放的目录 (默认 "/etc/kubernetes/pki")
    --certificate-key string kubeadm-cert secret 中 用于加密 control-plane 证书的key
    --config string kubeadm 配置文件的路径.
    --cri-socket string CRI socket 文件路径,如果为空 kubeadm 将自动发现相关的socket文件; 只有当机器中存在多个 CRI socket 或者 存在非标准 CRI socket 时才指定.
    --dry-run 测试,并不真正执行;输出运行后的结果.
    --feature-gates string 指定启用哪些额外的feature 使用 key=value 对的形式。
    --help -h 帮助文档
    --ignore-preflight-errors strings 忽略前置检查错误,被忽略的错误将被显示为警告. 例子: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks.
    --image-repository string 选择拉取 control plane images 的镜像repo (default "k8s.gcr.io")
    --kubernetes-version string 选择K8S版本. (default "stable-1")
    --node-name string 指定node的名称,默认使用 node 的 hostname.
    --pod-network-cidr string 指定 pod 的网络, control plane 会自动将 网络发布到其他节点的node,让其上启动的容器使用此网络
    --service-cidr string 指定service 的IP 范围. (default "10.96.0.0/12")
    --service-dns-domain string 指定 service 的 dns 后缀, e.g. "myorg.internal". (default "cluster.local")
    --skip-certificate-key-print 不打印 control-plane 用于加密证书的key.
    --skip-phases strings 跳过指定的阶段(phase)
    --skip-token-print 不打印 kubeadm init 生成的 default bootstrap token
    --token string 指定 node 和control plane 之间,简历双向认证的token ,格式为 [a-z0-9]{6}\.[a-z0-9]{16} - e.g. abcdef.0123456789abcdef
    --token-ttl duration token 自动删除的时间间隔。 (e.g. 1s, 2m, 3h). 如果设置为 '0', token 永不过期 (default 24h0m0s)
    --upload-certs 上传 control-plane 证书到 kubeadm-certs Secret.
  • 6️⃣问题又来了

    按步骤我一次的操作是能初始话成功,如果失败了可以kubeadm reset后再次初始化,

    按照集群初始化完的几乎描述,完成几个基础配置(就快好了😆)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config

    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
    source /etc/profile

    把join的那句也复制出来先,并在c2、c3上执行下
    kubeadm join 192.168.0.31:6443 --token *****.************ \
    --discovery-token-ca-cert-hash sha256:*************************

    查看👧pod们的状态

    1
    kubectl get pods --all-namespaces

    然后发现两个坏👧不太愿意启动,codedns的两个

    这个时候给他添加[flannel网络插件]

    1
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

    这里可以添加raw.githubusercontent.com在hosts中对应ip查询到的信息,或者

    1
    2
    wget https://sofunty.oss-cn-shenzhen.aliyuncs.com/k8s/kube-flannel.yml
    kubectl apply -f kube-flannel.yml

    注意这里的pod网段,kubeadm中指定了pod的网段,所以我这里也对应改了一下

    !!!🔥🔥🔥问题又来了,kube-flannel-*****的👧一直起不来,搜了搜,镜像拉不到😭

    好吧,给docker搭把手💪,本地电脑pull下来后导出image再scp上去load input

    1
    2
    3
    4
    5
    6
    7
    8
    9
    docker pull rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.0
    docker pull quay.io/coreos/flannel:v0.15.1
    docker save -o ./flannel-cni.tar rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.0
    docker save -0 ./flannel.tar quay.io/coreos/flannel:v0.15.1
    scp ./*.tar root@192.168.0.30:/root/

    c1上再
    docker load --input flannel-cni.tar && docker load --input flannel.tar
    同样也scp到c2、c3导入

    解决的方式有点硬了,😬😬😬

    后面reboot🖥️等待

    1
    kubectl get node

​ 🤤🤤🤤🤤 🤤嘿 嘿嘿 嘿嘿

添加dashboard

1
2
3
4
5
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
同理远程导入镜像
docker pull kubernetesui/metrics-scraper:v1.0.7
docker pull kubernetesui/dashboard:v2.4.0
...

创建token

👉docs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
echo 'apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
' >> dashboard-adminuser.yaml
kubectl apply -f dashboard-adminuser.yaml
echo 'apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard

' >> dashboard-ClusterRoleBinding.yaml
kubectl apply -f dashboard-ClusterRoleBinding.yaml
#保存token
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}" > token

暂时到这啦

🌙🌙🌙

  • 本文作者: 寒风
  • 本文链接: https://blog.sofunty.cn/2021/12/09/k8s-build/
  • 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
  • k8s
  • CentOS Stream release 8
  • k8s v1.22.4

扫一扫,分享到微信

k8s应用部署
有了SDKMAN,安装的系统装环境再也不用去一个个找包了
© 2020-2022 寒风
GitHub:hexo-theme-yilia-plus by Litten
本站总访问量次 | 本站访客数人