k8s-1-安装

keywords

  • Kubernetes(k8s)
  • jenkins
  • CI/CD

0. 引言

介绍搭建k8s+jenkins的基本流程

1. k8s介绍

参考:
kubernetes 从入门到实践
Kubernetes 入门教程
How To Setup Jenkins On Kubernetes Cluster – Beginners Guide
官方之安装 kubeadm
Kubernetes(K8S)简介

2. k8s安装/部署

2.1. k8s部署方案

k8s的几种安装方式

1. 使用官方工具kubeadm:kubeadm是一种用于快速部署k8s集群的官方工具。它提供了一些命令行工具来帮助用户安装和配置k8s集群。

2. 使用第三方工具:除了官方工具kubeadm外,还有一些第三方工具可以帮助用户部署k8s集群,如kops、kubespray等。

3. 使用云平台的k8s服务:云平台提供了一些托管的k8s服务,如AWS的EKS、GCP的GKE、阿里云的ACK等。这些服务可以让用户快速启动和管理k8s集群。

4. 手动安装:对于有经验的用户,也可以手动安装和配置k8s集群,这需要一些专业知识和技能。

下面选用第一种方式安装

2.2. 基于kubeadm安装

安装 kubeadm

  • 系统环境:ubuntu 20.04
  • 2台设备

2.2.1 安装docker-ce

master 和node都需要执行

sudo apt-get remove docker docker-engine docker.io
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce=5:20.10.12~3-0~ubuntu-$(lsb_release -cs) docker-ce-cli=5:20.10.12~3-0~ubuntu-$(lsb_release -cs) containerd.io -y
# 验证是否安装成功
sudo docker run hello-world

# docker 命令免sudo
sudo usermod -aG docker $USER

2.2.2 安装cri-tools

master 和node都需要执行

sudo sh -c 'echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_$(lsb_release -rs)/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list'
curl -fsSL https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/xUbuntu_$(lsb_release -rs)/Release.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/devel_kubic_libcontainers_stable.gpg > /dev/null
sudo apt-get update
sudo apt-get install cri-tools=1.21.0~2 -y

crictl --version

2.2.3 安装kubeadm 以及 kubelet、kubectl

master 和node都需要执行

# 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
# 下载 Google Cloud 公开签名秘钥:如果不能访问,可以参考下面的方案,采用阿里云的源
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
# 添加 Kubernetes apt 仓库
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:
sudo apt-get update
sudo apt-get install -y kubelet=1.23.1-00 kubeadm=1.23.1-00 kubectl=1.23.1-00
sudo apt-mark hold kubelet kubeadm kubectl

# 备用方案:如果不能访问google,可以使用阿里云的源
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-add-repository "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"
sudo apt-get update && sudo apt-get install -y kubelet=1.23.1-00 kubeadm=1.23.1-00 kubectl=1.23.1-00

2.2.4. 安装k8s需要的镜像

GCR_URL=k8s.gcr.io
INNER_CR=registry.cn-hangzhou.aliyuncs.com/google_containers
images=(kube-apiserver:v1.20.2
kube-controller-manager:v1.20.2
kube-scheduler:v1.20.2
kube-proxy:v1.20.2
pause:3.1
etcd:3.2.24
coredns:1.2.2)
for imageName in ${images[@]} ; do
    echo "${imageName}"
    docker pull $INNER_CR/$imageName
    docker tag $INNER_CR/$imageName $GCR_URL/$imageName
    docker rmi $INNER_CR/$imageName
done
  1. 上面镜像master都需要安装
  2. TODO: node 除了kube-proxy 和 pause外,其他的都不需要安装。至于kube-proxy 和 pause是否需要,待确认

2.2.5. jdk

master 和node都需要执行

# jenkins 依赖 jdk
sudo apt-get install -y openjdk-11-jdk

2.3. 开始使用

2.3.1. master

sudo service docker restart

# 初始化,启动k8s(该命令会拉起对应的组件,比如etcd、apiserver等)
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
# 根据提示,执行如下操作
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 安装网络插件:下面使用的是flannel
curl -o kube-flannel.yml https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml

sudo service kubelet restart

# 通过如下指令查看状态
kubectl get nodes
kubectl get pods --all-namespaces

2.3.2. node

node上只需要启动docker和kubelet即可

sudo service docker restart

# 配置
sudo kubeadm init phase certs all
sudo kubeadm init phase kubeconfig all
sudo kubeadm init phase kubelet-start

sudo service kubelet restart

2.3.3 node 节点加入master

下面只记录操作,具体实操该步骤未执行

  1. 在控制节点上执行以下命令获取加入集群的TOKEN和CA证书:
kubeadm token create --print-join-command

执行该命令后会输出kubeadm join命令,包含了加入集群的TOKEN和CA证书等必要参数。将该命令复制保存,以备后用。

  1. 在要加入的节点上以root用户身份执行前一步中获取到的kubeadm join命令。例如:
kubeadm join <k8s-master-ip>:<k8s-master-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
# k8s-master-ip为k8s集群控制节点的IP地址,k8s-master-port为控制节点监听的端口,默认为6443。
  1. 等待片刻,直到节点成功加入集群。可以在控制节点上使用kubectl get nodes命令查看节点的状态。

2.4. 过程中遇到的问题

  1. swap分区
    k8s时,系统必须禁止掉swap分区

  2. cgroup driver 问题

报错:"Failed to run kubelet" err="failed to run Kubelet: misconfiguration: kubelet cgroup driver: "systemd" is different from docker cgroup dri
如果在启动Kubelet时出现"Failed to run kubelet"错误,并且错误消息中包含"failed to run Kubelet: misconfiguration: kubelet cgroup driver: "systemd" is different from docker cgroup driver",则说明您的Kubernetes和Docker在cgroup driver方面的配置不匹配

解决:

Kubelet和Docker都需要使用相同的cgroup driver,以确保它们能够正确地管理容器和资源。默认情况下,Kubernetes使用systemd作为其cgroup driver,而Docker使用cgroupfs。如果这两个组件的cgroup driver不匹配,则无法启动Kubelet服务。
为了解决此问题,您需要将Docker的cgroup driver更改为systemd。可以按照以下步骤完成:
停止Docker服务:
sudo systemctl stop docker
修改Docker的配置文件/etc/docker/daemon.json,将"exec-opts": ["native.cgroupdriver=cgroupfs"]改为"exec-opts": ["native.cgroupdriver=systemd"]。如果该文件不存在,请创建它并添加以下内容:
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
完成后保存并关闭文件。
启动Docker服务:
sudo systemctl start docker
重新启动Kubelet服务:
sudo systemctl restart kubelet
完成后,Kubelet应该能够启动并正确运行了
  1. 网口占用

报错:networkPlugin cni failed to set up pod "example-pod_default" network: failed to delegate add: failed to set bridge addr: "cni0" already has an IP address different from 10.244.0.1/24

解决

ifconfig 看应该是cni的网口地址和配置不一致,可以直接删除
sudo ip link delete cni0
后续服务会自动创建一个正确的
  1. node节点的配置相关

报错:"command failed" err="failed to load kubelet config file, error: failed to load Kubelet config file /var/lib/kubelet/config.yaml, error failed to read kubelet config file "/var/lib/kubelet/config.yaml", error: open /var/lib/kubelet/config.yaml: no such file or directory, path: /var/lib/kubelet/config.yaml"

解决:

sudo kubeadm init phase kubelet-start

报错:open /etc/kubernetes/pki/ca.crt: no such file or directory"

解决:

sudo kubeadm init phase certs all

报错:stat /etc/kubernetes/bootstrap-kubelet.conf: no such file or directory"

解决:
unable to load bootstrap kubeconfig

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

解决:
# CRI v1 runtime API is not implemented for endpoint

3. 在master上安装jenkins

参考上述文档即可
https://devopscube.com/setup-jenkins-on-kubernetes-cluster/

其中deployment.yaml有小改动,如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: devops-tools
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins-server
  template:
    metadata:
      labels:
        app: jenkins-server
    spec:
      securityContext:
            fsGroup: 1000
            runAsUser: 1000
      serviceAccountName: jenkins-admin
      containers:
        - name: jenkins
          image: jenkins/jenkins:lts
          resources:
            limits:
              memory: "2Gi"
              cpu: "1000m"
            requests:
              memory: "500Mi"
              cpu: "500m"
          ports:
            - name: httpport
              containerPort: 8080
            - name: jnlpport
              containerPort: 50000
          livenessProbe:
            httpGet:
              path: "/login"
              port: 8080
            initialDelaySeconds: 90
            periodSeconds: 10
            timeoutSeconds: 5
            failureThreshold: 5
          readinessProbe:
            httpGet:
              path: "/login"
              port: 8080
            initialDelaySeconds: 60
            periodSeconds: 10
            timeoutSeconds: 5
            failureThreshold: 3
          volumeMounts:
            - name: jenkins-data
              mountPath: /var/jenkins_home
      tolerations:
        - key: "node-role.kubernetes.io/master"
          effect: "NoSchedule"
      volumes:
        - name: jenkins-data
          persistentVolumeClaim:
              claimName: jenkins-pv-claim
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容