本教程可以作为学习用集群,不能用于生产,生产环境还需要做更多调优和设置
适合ubuntu22.04 ,本人亲测可用
后续还会整理出k8s常用命令集

准备工作

准备三台服务器/虚拟机,网络能正常互通,能连网

192.168.15.81 master
192.168.15.82 node1
192.168.15.83 node2

所有节点执行以下命令

apt-get update            # 更新本地软件包列表,不会安装任何软件包
ufw status                # 检查防火墙是否关闭,如果没关闭就关闭执行 ufw disable 关闭

# 检查和关闭swap
swapon --show            # 显示系统当前已经激活的 swap 分区
swapoff -a                  # 临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久关闭

# 修改主机名
hostname                # 查看主机名
hostname master          # 临时修改主机名
vi /etc/hostname          # 永久修改

# 修改 hosts文件
vi /etc/hosts             # 增加以下配置
    192.168.15.81 master
    192.168.15.82 node1
    192.168.15.83 node2

# 加载br_netfilter 内核模块
modprobe br_netfilter        # 临时生效
vi /etc/modules-load.d/br_netfilter.conf        # 增加以下内容,永久生效
    br_netfilter

vi /etc/sysctl.d/k8s.conf                        # 增加以下内容
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    user.max_user_namespaces=28633
sysctl --system                                  # 生效
sysctl net.bridge.bridge-nf-call-iptables          # 检查是否生效
sysctl net.ipv4.ip_forward

# 时间同步
apt-get install ntp ntpdate -y
systemctl stop ntp
ntpdate time.windows.com
systemctl start ntp
systemctl status ntp
ntpq -p                    # 确认是否正常

# 安装docker
apt-get update
apt-get install apt-transport-https ca-certificates curl software-properties-common 
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
apt-cache policy docker-ce
apt install docker-ce
docker --version

#配置docker镜像下载加速器:
docker info | grep Cgroup # 确认cgroup是否是systemd
这个cgroups是啥呢,你可以把它理解成一个进程隔离工具,docker就是用它来实现容器的隔离的。docker 默认使用的是cgroupfs,而 k8s 也用到了一个进程隔离工具systemd,如果使用两个隔离组的话可能会引起异常,所以我们要把 docker 的也改成systemd。因为docker的版本问题,如果docker info结果中是systemd,那么"exec-opts"不需要设置,反之,则需要设置。总之,没事设置一次也没问题。
vi /etc/docker/daemon.json
{
  "registry-mirrors": [
      "https://l51yxa8e.mirror.aliyuncs.com",
      "https://dockerhub.azk8s.cn",
    "https://reg-mirror.qiniu.com",
    "https://quay-mirror.qiniu.com"
  ],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl restart docker
docker info 

# 使用阿里云提供的镜像源作为安装 Kubeadm 加速
# 这是旧版配置方法,只支持到k8s 1.28版,新版请参考 https://developer.aliyun.com/mirror/kubernetes
apt update
apt install -y apt-transport-https ca-certificates curl
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF | tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt update
apt-get install -y kubelet kubeadm kubectl

# 配置containerd
containerd config default | tee /etc/containerd/config.toml >/dev/null 2>&1
sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
vi /etc/containerd/config.toml
把这行:sandbox_image = "registry.k8s.io/pause:3.6"
改成:sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
systemctl restart containerd
systemctl status containerd

# 确认是否安装
kubelet --version
kubeadm version
kubectl version --client
dpkg -l | grep kubelet
dpkg -l | grep kubeadm
dpkg -l | grep kubectl
systemctl status kubelet

# 增加命令补全功能(k8s命令都很长,有了这个方便很多)
apt-get install bash-completion         # 安装 bash-completion,ubuntu应该默认带了
vi ~/.bashrc                                                
    alias k=kubectl            # 创建kubectl的别名
    source <(kubectl completion bash | sed s/kubectl/k/g)    # 增加命令补全功能(这样k 和 kubectl都会带命令补全)
source ~/.bashrc 
# 测试命令补全
kubectl get po(不要按Enter键)并按下Tab键

master节点执行以下命令

# 执行kubeadm时,需要用到一些镜像,我们需要提前准备。
# 查看需要依赖哪些镜像
kubeadm config images list --kubernetes-version 1.28.2
......
registry.k8s.io/kube-apiserver:v1.28.2
registry.k8s.io/kube-controller-manager:v1.28.2
registry.k8s.io/kube-scheduler:v1.28.2
registry.k8s.io/kube-proxy:v1.28.2
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.9-0
registry.k8s.io/coredns/coredns:v1.10.1
......

# 使用国内镜像先下载下来(使用和kubelet kubeadm kubectl相同的版本号)
docker pull registry.aliyuncs.com/google_containers/coredns:v1.10.1
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.2
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.2
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.2
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.28.2
docker pull registry.aliyuncs.com/google_containers/pause:3.9
docker pull registry.aliyuncs.com/google_containers/etcd:3.5.9-0

docker pull coredns/coredns:1.8.4
docker tag coredns/coredns:1.8.4 registry.aliyuncs.com/google_containers/coredns:v1.8.4

# 检查systemd相关
当systemd是init系统时,不建议使用cgroupfs驱动程序,因为systemd希望系统上只有一个cgroup管理器。
此外,如果使用cgroup v2,请使用systemd cgroup驱动程序,而不是cgroupfs
判定systemd是否是你的系统的init系统
ps -p 1 -o comm=
或者
ls -l /sbin/init
怎么确定是否在使用cgroup v2
mount | grep cgroup
或者
stat -fc %T /sys/fs/cgroup/

编辑kubelet配置文件,检查是否指定了systemd
总之,ubuntu22.04上安装k8s和docker,都使用systemd作为cgroup
举例:
vi /var/lib/kubelet/config.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
...
cgroupDriver: systemd

# 初始化 kubeadm
kubeadm init \
  --apiserver-advertise-address=192.168.15.81 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.28.2 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --ignore-preflight-errors=all
参数说明:
  --image-repository registry.aliyuncs.com/google_containers 镜像仓库,离线安装需要把相关镜像先拉取下来
 --apiserver-advertise-address 集群通告地址
 --image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
 --kubernetes-version K8s版本,与上面安装的一致
 --service-cidr 集群内部虚拟网络,Pod统一访问入口
 --pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致

如果执行成功,会出现类似输出:
......
To start using your cluster, you need to run the following as a regular user:
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
  export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.15.81:6443 --token e8bd5p.hsx0g83eyilxxxxx \
        --discovery-token-ca-cert-hash sha256:1142acd899769696810560a759c33f546a859d85f83af0b7348cc8373acxxxxx

注意:kubeadm join 。。。。。。 这段需要记录下面,后面加入节点时需要用

# 拷贝k8s认证文件
# 根据上面提示,如果是普通用户安装k8s,执行下面命令
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 如果是root用户安装k8s,执行下面命令即可
mkdir -p /root/.kube && \
cp /etc/kubernetes/admin.conf /root/.kube/config

# 安装Flannel
# Flannel 是 Kubernetes 中常用的网络插件,用于在集群中提供网络通信功能
# Flannel 和 Calico 的比较轻参见另外一篇blog
# https://blog.csdn.net/weilaozongge/article/details/138706189?spm=1001.2014.3001.5502
# 这里我们使用 Flannel
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

node节点执行以下命令

kubeadm join 192.168.15.81:6443 \
    --token e8bd5p.hsx0g83eyilxxxxx \
    --discovery-token-ca-cert-hash sha256:1142acd899769696810560a759c33f546a859d85f83af0b7348cc8373acxxxxx

注意,如果node在master init之后没有马上执行join,比如之后master重启了再执行kubeadm,此时会失败,master需要重新init

master节点上运行 kubectl get nodes 命令来查看集群中的节点状态。
如果新加入的节点成功连接到集群,它应该在列表中显示,并且状态应该为 “Ready”
或者查看/var/log/syslog日志

部署 Dashboard (可以不装)

Dashboard 是官方提供的一个UI,可用于基本管理K8s资源。

# 在master节点执行

# 
wget \
https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml
vi recommended.yaml 
增加 nodePort: 30001 和 type: NodePort
......
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort
......

kubectl apply -f recommended.yaml
kubectl get pods -n kubernetes-dashboard

如果顺利,则可以访问 https://192.168.15.81:30001
界面提示需要输入 token,先不要输入,因为还没创建用户,接下去我们创建用户

K8S有两种用户:User 和 Service Account,User 给人用,Service Account 给进程用,让进程有相关权限,Dashboard 是一个进程,我们就可以创建一个Service Account 给它


# 创建service account并绑定默认cluster-admin管理员集群角色:
# 创建用户
kubectl create serviceaccount dashboard-admin -n kube-system
# 用户授权
kubectl create clusterrolebinding dashboard-admin-binding --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

# kubernetes v1.24.0 更新之后进行创建 ServiceAccount 不会自动生成 Secret 需要对其手动创建
cat<<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
  name: dashboard-admin
  annotations:
    kubernetes.io/service-account.name: "dashboard-admin"
  namespace: kube-system
EOF
# 查看token是否正确生成
kubectl describe serviceaccounts dashboard-admin -n kube-system
如果顺利会出现下述输出
...
Tokens:              dashboard-admin
...

# 获取用户Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

取得token后就可以使用token登录Dashboard了
https://192.168.15.81:30001

安装完之后,可以看到k8s所有组件,但各组件cpu内存使用量没有值,还需要安装metrics组件才行,安装完metric就可以看到各node以及pod的cpu/mem实时使用量了
下面是如何安装metrics

下载Metrics Server 配置文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics.yaml

修改配置文件,修改以下内容
......
    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=10250
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls     # 增加这行,禁用 TLS 证书验证。生产环境禁用这个选项并配置了正确的 TLS 证书和签名
        image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.7.1             # 改为从阿里云代理拉取镜像
......

kubectl apply -f ./metrics.yaml

过1-2分钟,然后验证安装
kubectl get apiservice | grep metrics
确保 `v1beta1.metrics.k8s.io` 的状态为 `True`。
如果不是,则运行下面命令排查错误
kubectl get pods -n kube-system | grep metrics-server
kubectl logs metrics-server-75d7968c55-qxlcr -n kube-system
kubectl get events --sort-by='.metadata.creationTimestamp' -n kube-system | tail -n10

如果一切ok,则可以查看节点和 Pod 的 CPU 使用情况

NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
node-1         500m         25%    1024Mi          50%
node-2         300m         15%    512Mi           25%
node-3         700m         35%    2048Mi          75%

kubectl top pods --all-namespaces

NAMESPACE     NAME                                    CPU(cores)   MEMORY(bytes)
default       my-app-deployment-7d9f6d89d9-abcde      100m         128Mi
kube-system   coredns-64897985d-vfx8s                 5m           12Mi
kube-system   metrics-server-85f4b44d5c-mr4tj         10m          24Mi

此时再次打开dashborad,就可以看到node和pod的cpu内存使用情况。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐