美文网首页
Kubernetes 开发环境搭建

Kubernetes 开发环境搭建

作者: 河码匠 | 来源:发表于2023-12-17 11:14 被阅读0次

    一. 基本环境

    操作系统环境 ubuntu20.04 (kubernetes的kube kubelet 不支持 macos M1。项目也能起来,但是没法创建节点 )
    Kubernetes 版本 1.29
    go 版本 1.21.4

    二. github 下载 Kubernetes

    • 目录结构

    根据 GOPATH 目录将 Kubernetes 源码下载到 {$GOPATH}/src/k8s.io/ 里面
    我的 GOPATH="/root/go"

    └── go
        ├── pkg
        └── src
            └── k8s.io
                └── kubernetes
                    ├── CHANGELOG
                    ├── CHANGELOG.md -> CHANGELOG/README.md
                    ├── CONTRIBUTING.md
                    ├── LICENSE
                    ├── LICENSES
                    ├── Makefile -> build/root/Makefile
                    ├── OWNERS
                    ├── OWNERS_ALIASES
                    ├── README.md
                    ├── SECURITY_CONTACTS
                    ├── SUPPORT.md
                    ├── _output
                    ├── api
                    ├── build
                    ├── cluster
                    ├── cmd
                    ├── code-of-conduct.md
                    ├── docs
                    ├── go.mod
                    ├── go.sum
                    ├── hack
                    ├── logo
                    ├── pkg
                    ├── plugin
                    ├── staging
                    ├── test
                    ├── third_party
                    └── vendor
    

    三. 安装环境需要的软件

    官网开发环境说明

    1. 安装软件

    ubuntu

    apt install jq
    apt install gnome-terminal
    apt-get install ca-certificates curl gnupg
    

    mac

    brew install coreutils ed findutils gawk gnu-sed gnu-tar grep make jq
    

    2. 安装 Docker

    ubuntu

    apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    

    mac
    直接下载 Docker 客户端安装即可

    3. 安装 Go

    安装 go 需要的库

    go get ./...
    

    安装 cfssl

    go install github.com/cloudflare/cfssl/cmd/...@latest
    

    4. 安装 PyYAML

    pip3 install PyYAML
    

    5. 执行 etcd 安装脚本 ./kubernetes/hack/install-etcd.sh

    # ./hack/install-etcd.sh
    
    Downloading https://github.com/etcd-io/etcd/releases/download/v3.5.10/etcd-v3.5.10-darwin-arm64.zip succeed
    Archive:  etcd-v3.5.10-darwin-arm64.zip
       creating: etcd-v3.5.10-darwin-arm64/
      inflating: etcd-v3.5.10-darwin-arm64/README.md
      inflating: etcd-v3.5.10-darwin-arm64/READMEv2-etcdctl.md
      inflating: etcd-v3.5.10-darwin-arm64/etcdutl
      inflating: etcd-v3.5.10-darwin-arm64/etcdctl
       creating: etcd-v3.5.10-darwin-arm64/Documentation/
      inflating: etcd-v3.5.10-darwin-arm64/Documentation/README.md
       creating: etcd-v3.5.10-darwin-arm64/Documentation/dev-guide/
       creating: etcd-v3.5.10-darwin-arm64/Documentation/dev-guide/apispec/
       creating: etcd-v3.5.10-darwin-arm64/Documentation/dev-guide/apispec/swagger/
      inflating: etcd-v3.5.10-darwin-arm64/Documentation/dev-guide/apispec/swagger/v3election.swagger.json
      inflating: etcd-v3.5.10-darwin-arm64/Documentation/dev-guide/apispec/swagger/rpc.swagger.json
      inflating: etcd-v3.5.10-darwin-arm64/Documentation/dev-guide/apispec/swagger/v3lock.swagger.json
      inflating: etcd-v3.5.10-darwin-arm64/README-etcdutl.md
      inflating: etcd-v3.5.10-darwin-arm64/README-etcdctl.md
      inflating: etcd-v3.5.10-darwin-arm64/etcd
    etcd v3.5.10 installed. To use:
    export PATH="/root/g/src/k8s.io/kubernetes/third_party/etcd:${PATH}"
    

    PATH="/root/go/src/k8s.io/kubernetes/third_party/etcd:${PATH}" 添加到环境变量里面去

    四. 添加环境变量

    1. 定义容器运行时

    export CONTAINER_RUNTIME_ENDPOINT="unix:///run/containerd/containerd.sock"
    

    2. 其他环境变量

    ubuntu
    vim ~/.profile

    export GOPATH="/root/go/"
    export PATH="/root/go/src/k8s.io/kubernetes/third_party/etcd:${PATH}"
    export PATH="$PATH:/usr/local/go/bin"
    export KUBECONFIG=/var/run/kubernetes/admin.kubeconfig
    

    mac
    vim ~/.bashrc

    GNUBINS="$(find `brew --prefix`/opt -type d -follow -name gnubin -print)"
    
    for bindir in ${GNUBINS[@]}
    do
      export PATH=$bindir:$PATH
    done
    
    export GOPATH="/Users/machao/Desktop/Projects/kubernetes"
    # 这是 go 的 bin 目录
    PATH="$/xxx/go/bin:$PATH"
    
    export PATH
    

    五. 执行 make verify 检测系统环境。

    FAILED TESTS
    ========================
    # 我这里报下面错这个错误,需要"上网"才能下载镜像
    hack/make-rules/../../hack/verify-codegen.sh
    
    # 提示可以无视这个警告
    hack/make-rules/../../hack/verify-golangci-lint.sh
    
    # 这个报错一般都是 "GOPATH" 配置和项目所在位置不匹配
    hack/make-rules/../../hack/verify-import-aliases.sh
    
    # 这个报错执行"hack/update-openapi-spec.sh" 就好了
    hack/make-rules/../../hack/verify-openapi-spec.sh
    
    # 这里报错是没安装 pyyaml
    hack/make-rules/../../hack/verify-publishing-bot.py
    
    

    六. 构建 Kubernetes

    1. make 构建 Kubernetes

    make all 构建所有。也可以指定想要构建的组件,如: make WHAT=cmd/kubectl

    # make all
    
    go version go1.21.4 darwin/arm64
    +++ [1206 11:39:39] Building go targets for darwin/arm64
        k8s.io/kubernetes/cmd/kube-proxy (static)
        k8s.io/kubernetes/cmd/kube-apiserver (static)
        k8s.io/kubernetes/cmd/kube-controller-manager (static)
        k8s.io/kubernetes/cmd/kubelet (non-static)
        k8s.io/kubernetes/cmd/kubeadm (static)
        k8s.io/kubernetes/cmd/kube-scheduler (static)
        k8s.io/component-base/logs/kube-log-runner (static)
        k8s.io/kube-aggregator (static)
        k8s.io/apiextensions-apiserver (static)
        k8s.io/kubernetes/cluster/gce/gci/mounter (static)
        k8s.io/kubernetes/cmd/kubectl (non-static)
        k8s.io/kubernetes/cmd/kubectl-convert (static)
        github.com/onsi/ginkgo/v2/ginkgo (non-static)
        k8s.io/kubernetes/test/e2e/e2e.test (test)
        k8s.io/kubernetes/test/conformance/image/go-runner (non-static)
        k8s.io/kubernetes/cmd/kubemark (static)
        github.com/onsi/ginkgo/v2/ginkgo (non-static)
    

    2. 启动本地集群 ENABLE_DAEMON=true DBG=1 ./hack/local-up-cluster.sh

    DBG=1 开启调试模式在启动过程中可以看到很多日志
    ENABLE_DAEMON=true 启动守护进城,不然自己会退出

    # ENABLE_DAEMON=true DBG=1 ./hack/local-up-cluster.sh 
    .................
    No resources found
    No resources found
    No resources found
    No resources found
    ...........
    Create default storage class for
    storageclass.storage.k8s.io/standard created
    Local Kubernetes cluster is running. Press Ctrl-C to shut it down.
    
    Configurations:
      /private/var/folders/81/r5d92sr51yv2cn4h4b8fdd5c0000gn/T/local-up-cluster.sh.TMd54w/kube-audit-policy-file
      /private/var/folders/81/r5d92sr51yv2cn4h4b8fdd5c0000gn/T/local-up-cluster.sh.TMd54w/kube-scheduler.yaml
      /private/var/folders/81/r5d92sr51yv2cn4h4b8fdd5c0000gn/T/local-up-cluster.sh.TMd54w/kube-serviceaccount.key
      /private/var/folders/81/r5d92sr51yv2cn4h4b8fdd5c0000gn/T/local-up-cluster.sh.TMd54w/kube_egress_selector_configuration.yaml
    
    Logs:
      /tmp/etcd.log
      /tmp/kube-apiserver.log
      /tmp/kube-controller-manager.log
    
    
      /tmp/kube-scheduler.log
    
    
    To start using your cluster, you can open up another terminal/tab and run:
    
      export KUBECONFIG=/var/run/kubernetes/admin.kubeconfig
      cluster/kubectl.sh
    
    Alternatively, you can write to the default kubeconfig:
    
      export KUBERNETES_PROVIDER=local
    
      cluster/kubectl.sh config set-cluster local --server=https://localhost:6443 --certificate-authority=/var/run/kubernetes/server-ca.crt
      cluster/kubectl.sh config set-credentials myself --client-key=/var/run/kubernetes/client-admin.key --client-certificate=/var/run/kubernetes/client-admin.crt
      cluster/kubectl.sh config set-context local --cluster=local --user=myself
      cluster/kubectl.sh config use-context local
      cluster/kubectl.sh
    

    中途会有 No resources found 这个提示,不用管他,这个是在获取 node 节点信息。因为没创建出来所以提示 No resources found。等一会儿就好了

    3. 配置 kubectl 配置文件

    # export KUBECONFIG=/var/run/kubernetes/admin.kubeconfig
    

    七. 查看是否成功

    1. 查看进城

    # ps -a | grep kube
     248451 pts/0    00:00:10 kube-apiserver
     248595 pts/0    00:00:03 kube-controller
     248597 pts/0    00:00:01 kube-scheduler
     248708 pts/0    00:00:03 kubelet
     248857 pts/0    00:00:00 kube-proxy
    

    2. 查看资源信息

    # ./cluster/kubectl.sh cluster-info
    
    Kubernetes control plane is running at https://localhost:6443/
    CoreDNS is running at https://localhost:6443//api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
    
    To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
    
    # ./cluster/kubectl.sh get nodes
    
    NAME        STATUS   ROLES    AGE   VERSION
    127.0.0.1   Ready    <none>   82s   v1.30.0-alpha.0.354+0a54839370b82d
    
    # ./cluster/kubectl.sh get pods -A
    
    NAMESPACE     NAME                       READY   STATUS    RESTARTS   AGE
    kube-system   coredns-69cbfb9798-xgwq9   1/1     Running   0          20m
    

    八. 遇到的错误

    1. 启动时发现 kebelet 没有启动

    • 分析过程

    查看日志 tmp/kubelet.log 发现下面这个错误

    failed to run Kubelet: validate service connection: validate CRI v1 runtime API for endpoint \"unix:///run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService
    

    里面有一个 validate CRI v1 runtime API 发现没有运行

    • 解决过程
    1. 重启 containerd 并查看日志 journalctl -f -u containerd 发现正常
    2. 查看 /etc/containerd/config.toml 发现 cri 禁用了。启用这个插件

    Container Runtime Interface (CRI) 插件,它是 containerd 用于与 Kubernetes 通信的关键组件

    #disabled_plugins = ["cri"]
    disabled_plugins = []
    
    1. 重启 containerd
    systemctl restart containerd
    
    1. 重启 kubernetes 集群,成功

    2. coredns pod 为 CrashLoopBackOff 状态

    # ./cluster/kubectl.sh get pods -A
    NAMESPACE     NAME                       READY   STATUS             RESTARTS      AGE
    kube-system   coredns-69cbfb9798-zph7c   0/1     CrashLoopBackOff   3 (35s ago)   80s
    
    • 分析过程

    查看 pod 日志

    # ./cluster/kubectl.sh logs coredns-69cbfb9798-zph7c -n kube-system
    
    .:53
    [INFO] plugin/reload: Running configuration SHA512 = 591cf328cccc12bc490481273e738df59329c62c0b729d94e8b61db9961c2fa5f046dd37f1cf888b953814040d180f52594972691cd6ff41be96639138a43908
    CoreDNS-1.11.1
    linux/arm64, go1.20.7, ae2bbc2
    [FATAL] plugin/loop: Loop (127.0.0.1:33907 -> :53) detected for zone ".", see https://coredns.io/plugins/loop#troubleshooting. Query: "HINFO 1890283224315596440.6052109503740083691."
    

    意思是说 DNS 是本地回环
    查看 DNS

    # cat /etc/resolv.conf
    nameserver 127.0.0.53
    search localdomain
    

    coredns 官方解释

    • 解决过程
    1. 尝试直接修改 /etc/resolv.conf
    nameserver 192.168.17.2
    search localdomain
    

    然后重启 kubernetes 集群,发现 /etc/resolv.conf 又被改回去了(我发现只要重 新 make all 就会被改回去。不知道怎么搞 - -)

    1. 安装 apt install resolvconf 他是管理系统的 DNS 解析配置

    /run/resolvconf/interface/systemd-resolvedresolvconf 生成的
    修改 /run/resolvconf/interface/systemd-resolved 这个是永久修改 DNS 方法

    # cat /run/resolvconf/interface/systemd-resolved
    nameserver 192.168.17.2
    search localdomain
    
    1. 在尝试过程过发现 /run/systemd/resolve/resolv.conf 这里面也有一个 DNS

    /run/systemd/resolve/resolv.conf 保存的是静态配置、DHCP 或 VPN 生成的 DNS

    # ls -al /etc/resolv.conf
    lrwxrwxrwx 1 root root 29 Dec 22 02:42 /etc/resolv.conf -> ../run/resolvconf/resolv.conf
    
    1. sudo resolvconf -u 生效新的 dns
    2. 重启 kubernetes 集群(这里重启我是加 -O 参数,不重新 make),成功

    相关文章

      网友评论

          本文标题:Kubernetes 开发环境搭建

          本文链接:https://www.haomeiwen.com/subject/echdgdtx.html