使用kubeadmin快速部署k8s

一、环境部署

此次考试使用的是v1.22版本,由于有升级考题,所以先安装v1.21版本

安装方式:kubeadmin 安装最低配置:2C/2G

ip主机名操作系统配置角色
192.168.248.120k8s-masterCentos7.92C/4Gmaster
192.168.248.121k8s-node01Centos7.92C/4Gnode1
192.168.248.122k8s-node02Centos7.92C/4Gnode2

1.系统初始化

在三台机器执行以下操作

  1. 修改hosts

    cat >> /etc/hosts <<EOF
    192.168.248.120    k8s-master
    192.168.248.121    k8s-node01
    192.168.248.122    k8s-node02
    EOF
  2. 关闭防火墙和selinux

    # 关闭防火墙
    systemctl stop firewalld
    systemctl disable firewalld
    # 关闭selinux:
    setenforce 0 # 临时
    sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
  3. 关闭swap

    swapoff -a  # 临时
    sed -ri 's/.*swap.*/#&/' /etc/fstab  # 永久
  4. 同步时间

    # 同步系统时间(可以访问外网才能同步,如果没有外网请使用其它方式同步。如内网时间服务器):
    yum install ntpdate -y # 安装ntpdate命令
    ntpdate time.windows.com # time.windows.com为时间服务器地址,可以根据需求更换为别的地址
    # 如果服务器时区不对,可以修改一下
    timedatectl set-timezone 'Asia/Shanghai'
  5. 修改主机名

    # 120执行
    hostnamectl  set-hostname k8s-master
    # 121执行
    hostnamectl  set-hostname k8s-node01
    # 122执行
    hostnamectl  set-hostname k8s-node02
    # 修改完成后查看
    hostname
  6. 配置yum源

    rm -rf /etc/yum.repos.d/*
    # 使用阿里源
    wget -O /etc/yum.repos.d/CentOS7-Aliyun.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    # 安装依赖
    yum install -y yum-utils device-mapper-persistent-data lvm2 
    # 设置docker源
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    # 设置kubernetes源
    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
            http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
  7. 修改内核参数

    cat > /etc/sysctl.d/k8s.conf << EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    # 生效
    sysctl --system
  8. 安装docker

    yum install docker-ce -y # 不指定版本安装的是最新版本
    # 如果安装别的版本可以指定版本,如
    yum -y install docker-ce-18.06.1.ce-3.el7
    # 安装完成后启动,并加入开机启动
    systemctl start docker && systemctl enable docker
    # 启动完成后查看
    docker info
    ​
    # 配置docker
    mkdir -p /etc/docker
    cat > /etc/docker/daemon.json << EOF 
    { "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] }
    EOF
    # 重启
    systemctl  restart docker

  9. 所有节点安装软件包

    # 如果不指定版本会安装最新的版本,这里先安装1.21版本后面再进行升级
    yum install -y kubelet-1.21.1-0 kubeadm-1.21.1-0 kubectl-1.21.1-0
    # 启动kubelet并设置开机启动
    systemctl restart kubelet; systemctl enable kubelet

2. 安装master

master节点操作

  1. 执行初始化

    执行中会报coredns 找不到的错误,以下是解决方法

    # 拉取镜像
    docker pull coredns/coredns:1.8.0
    # 修改tag
    docker tag coredns/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0

    执行初始化命令

    kubeadm init --kubernetes-version=1.21.1  --apiserver-advertise-address=120.48.66.186   --image-repository registry.aliyuncs.com/google_containers  --service-cidr=10.244.0.0/16 --pod-network-cidr=10.244.0.0/16

    参数说明:

    • --kubernetes-version:k8s版本

    • --apiserver-advertise-address:apiserver的地址

    • --image-repository :指定下载地址为阿里云

    • --kubernetes-version=1.21.1 :指定安装版本为1.21.1

    • pod-network-cidr :指定pod的网段

    如果执行报错,执行一下命令重置:

    kubeadm reset
    systemctl daemon-reload
    systemctl restart kubelet
    iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
    iptables -nL #检查防火墙规则是否清空
    netstat -antlp #检查端口是否全被放开

    安装过程跟网速有关,镜像比较大,可能会比较慢,可以新打开一个窗口查看镜像下载情况:

    docker images

    以下是执行成功的提示

  2. 复制配置文件

    安装提示步骤执行即可

    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config

3. node节点加入集群

以下步骤在node节点执行

分别在两个node节点执行以下命令(此语句是执行完init后提示的语句,不要直接复制下面的语句)

kubeadm join 192.168.248.120:6443 --token hur3eq.c5s9ui4j4qr3vrxe \
        --discovery-token-ca-cert-hash sha256:f8cf3fc549f6d0816dd656062ce1b18cbadc16cdd44ac77ff174a10d64ac796c

如果提示错误:[ERROR Port-10250]: Port 10250 is in use

在此节点执行重置命令:kubeadm reset

重新执行kubeadm join

以下是执行成功截图

两台都执行完成kubeadm join后切换到master节点执行:

kubectl get nodes
# 执行结果节点状态为:NotReady,这是正常的因为没有安装网络插件

4.安装calico网络插件

在kubernetes集群中,pod是分配在不同的节点上的,为了实现这些pod跨主机访问通信,需要安装CNI插卡,这里使用calico

以下步骤在master节点执行

  1. 下载安装文件

    wget  https://docs.projectcalico.org/v3.19/manifests/calico.yaml --no-check-certificate
  2. 修改配置

    打开配置文件,查找"192",去掉注释然后把网段改为之前init时pod-network-cidr配置的网段地址

    注意:这里一定要注意格式,- name 、value要和下面的name、value对齐

    vim calico.yaml
    # 查找修改
                - name: CALICO_IPV4POOL_CIDR
                  value: "10.244.0.0/16"

  3. 部署

    # 执行部署命令
    kubectl apply -f calico.yaml
  4. 测试

    执行完成后部署后,如果没有报错,可以查看镜像下载情况,镜像文件比较大也需要等待一会

    docker images |grep calico

    查看calico pod状态

    kubectl  get pod  -n kube-system |grep calico

    pod状态都为Running后,再次查看节点,状态是否为Ready

    kubectl  get nodes

5. 安装后的设置

  1. kubectl命令补全

    集群安装完成后kubectl命令都是在master节点执行。但是有个缺点就是kubectl不能按Tab键进行补全,这里需要设置一下:

    yum install bash-completion
    source <(kubectl completion bash) # 在 bash 中设置当前 shell 的自动补全,要先安装 bash-completion 包。
    echo "source <(kubectl completion bash)" >> ~/.bashrc # 在您的 bash shell 中永久的添加自动补全

6.删除节点

有时需要把集群中某个节点移除

下面演示如何把node02从集群中移除

  1. 驱逐节点

    # 获取节点名
    kubectl get nodes
    # 驱逐节点,设置不可调度并驱逐节点上 Pod
    kubectl  drain k8s-node02 --ignore-daemonsets

    如果报错可以根据提示再加上选项

    kubectl  drain k8s-node01 --ignore-daemonsets --delete-local-data --force
  2. 改为可调度

    如果想把驱除的节点改为可调度

    kubectl  uncordon k8s-node02

7. 常用命令

  1. 查看集群信息

    # 查看集群信息
    kubectl cluster-info

    # 查看kubernetes版本
    kubectl  version
    # 精简输出
    kubectl  version --short

  2. 查看kubernetes支持的api版本

    kubectl api-versions

8.监控资源

考试和日常使用中都会涉及查看pod或节点资源情况,需要安装监控。

这里使用metric-server进行演示

  1. 安装

    以下操作在master节点执行

    # 下载,如果github访问不了,可以试试git加速
    wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.5.2/components.yaml

    修改配置文件:

    vim metrics-server-deployment.yaml

    修改内容:

    # 镜像地址
    image: k8s.gcr.io/metrics-server/metrics-server:v0.5.2
    # 改为
    image: registry.aliyuncs.com/google_containers/metrics-server:v0.5.2
    # 删掉 ExternalIP,Hostname这两个,这里已经改好了,你那边要自己核对一下
    - --kubelet-preferred-address-types=InternalIP   
    # 加上
    - --kubelet-insecure-tls

    完整的yaml文件:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        k8s-app: metrics-server
      name: metrics-server
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      labels:
        k8s-app: metrics-server
        rbac.authorization.k8s.io/aggregate-to-admin: "true"
        rbac.authorization.k8s.io/aggregate-to-edit: "true"
        rbac.authorization.k8s.io/aggregate-to-view: "true"
      name: system:aggregated-metrics-reader
    rules:
    - apiGroups:
      - metrics.k8s.io
      resources:
      - pods
      - nodes
      verbs:
      - get
      - list
      - watch
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      labels:
        k8s-app: metrics-server
      name: system:metrics-server
    rules:
    - apiGroups:
      - ""
      resources:
      - pods
      - nodes
      - nodes/stats
      - namespaces
      - configmaps
      verbs:
      - get
      - list
      - watch
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      labels:
        k8s-app: metrics-server
      name: metrics-server-auth-reader
      namespace: kube-system
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: extension-apiserver-authentication-reader
    subjects:
    - kind: ServiceAccount
      name: metrics-server
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      labels:
        k8s-app: metrics-server
      name: metrics-server:system:auth-delegator
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:auth-delegator
    subjects:
    - kind: ServiceAccount
      name: metrics-server
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      labels:
        k8s-app: metrics-server
      name: system:metrics-server
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:metrics-server
    subjects:
    - kind: ServiceAccount
      name: metrics-server
      namespace: kube-system
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        k8s-app: metrics-server
      name: metrics-server
      namespace: kube-system
    spec:
      ports:
      - name: https
        port: 443
        protocol: TCP
        targetPort: https
      selector:
        k8s-app: metrics-server
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        k8s-app: metrics-server
      name: metrics-server
      namespace: kube-system
    spec:
      selector:
        matchLabels:
          k8s-app: metrics-server
      strategy:
        rollingUpdate:
          maxUnavailable: 0
      template:
        metadata:
          labels:
            k8s-app: metrics-server
        spec:
          containers:
          - args:
            - --cert-dir=/tmp
            - --secure-port=4430
            - --kubelet-preferred-address-types=InternalIP
            - --kubelet-insecure-tls
            - --kubelet-use-node-status-port
            - --metric-resolution=15s
            image: registry.aliyuncs.com/google_containers/metrics-server:v0.5.2
            imagePullPolicy: IfNotPresent
            livenessProbe:
              failureThreshold: 3
              httpGet:
                path: /livez
                port: https
                scheme: HTTPS
              periodSeconds: 10
            name: metrics-server
            ports:
            - containerPort: 4430
              name: https
              protocol: TCP
            readinessProbe:
              failureThreshold: 3
              httpGet:
                path: /readyz
                port: https
                scheme: HTTPS
              initialDelaySeconds: 20
              periodSeconds: 10
            resources:
              requests:
                cpu: 100m
                memory: 200Mi
            securityContext:
              readOnlyRootFilesystem: true
              runAsNonRoot: true
              runAsUser: 1000
            volumeMounts:
            - mountPath: /tmp
              name: tmp-dir
          nodeSelector:
            kubernetes.io/os: linux
          priorityClassName: system-cluster-critical
          serviceAccountName: metrics-server
          volumes:
          - emptyDir: {}
            name: tmp-dir
    ---
    apiVersion: apiregistration.k8s.io/v1
    kind: APIService
    metadata:
      labels:
        k8s-app: metrics-server
      name: v1beta1.metrics.k8s.io
    spec:
      group: metrics.k8s.io
      groupPriorityMinimum: 100
      insecureSkipTLSVerify: true
      service:
        name: metrics-server
        namespace: kube-system
      version: v1beta1
      versionPriority: 100

    执行部署:

    kubectl  apply -f components.yaml

    查看是否启动

    kubectl get  pod -n kube-system |grep metric
  2. 查看node节点负载

    查看,并对内存排序

    kubectl top node  --sort-by="memory" // --sort-by="memory" 表示根据内存排序

    查看,并CPU排序

    kubectl top node --sort-by='cpu'

  3. 查看pod负载

    查看,并CPU排序

    kubectl top pod --sort-by='cpu' -A  //-A 表示所有的表空间

    查看,并内存排序

    kubectl top pod --sort-by='memory' -A

二、升级K8S

之前部署的k8s版本为1.21,此次考试使用的版本是1.22这里模拟升级到1.22版本

注意:

  • 考试使用的是ubuntu系统,升级方式有些不同。

  • k8s不能跨级升级

  • 此方式只适合于kubeadm方式安装的集群

1. 升级master

  1. 升级kubeadm

    # 驱逐master节点
    kubectl drain k8s-master --ignore-daemonsets
    # 查看节点是否驱逐
    kubectl  get node
    # 升级kubeadm到1.22.1
    yum install -y  kubeadm-1.22.1-0
    # 查看版本
    kubeadm version
    # 命令查看是否可以升级
    kubeadm upgrade plan
    # 执行升级命令 
    kubeadm upgrade apply v1.22.1  // 执行会提示“y/N”

    执行成功会提示[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.22.1". Enjoy!

    升级kubelet和kubectl

    # 安装
    yum install -y kubelet-1.22.1-0 kubectl-1.22.1-0 --disableexcludes=kubernetes
    # 重启
    systemctl daemon-reload
    systemctl restart kubelet
    # 查看版本
    kubectl version --short

    # 取消驱逐
    kubectl uncoredn k8s-master

    如果集群还有其他的master节点,升级步骤和上述一致,但是需要把kubeadm upgrade apply v1.22.1换成kubeadm upgrade node

2.升级节点机

升级步骤和master几点一致,先把节点设置为维护模式(驱逐节点),然后升级kubeadm,再升级kubectl和kubelet

在另外两台节点机执行以下步骤:

注意驱逐在master节点执行,并需要修改节点名称

# 在master节点执行:驱逐node1,如果是node2改下名字即可
kubectl drain k8s-node01 --ignore-daemonsets
# 查看节点是否驱逐
kubectl  get node
# 在两台节点升级kubeadm到1.22.1
yum install -y  kubeadm-1.22.1-0
# 查看版本
kubeadm version
# 执行升级命令 
kubeadm upgrade node 
# 更新kubelet和kubectl
yum install -y kubelet-1.22.1-0 kubectl-1.22.1-0 --disableexcludes=kubernetes
# 重启
systemctl daemon-reload
systemctl restart kubelet

在master节点取消两台机器驱逐

kubectl uncordon k8s-node01
kubectl uncordon k8s-node02
# 查看节点信息
kubectl get node

三. 部署Dashboard

Dashboard是k8s的一个web页面,不部署也可以。

# 应用部署文件
kubectl apply -f kubernetes-dashboard.yaml
# 查看状态
kubectl  get pod,svc -n kubernetes-dashboard

访问页面:https://NodeIP:30001

NodeIP是指随意一个node服务器ip,如:

创建service account并绑定默认cluster-admin管理员集群角色:

kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

执行完复制token

粘贴并登陆:

登陆后的页面:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kyrie_H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值