安装kubernetes(k8s 1.28版 utunbu)
ubuntu22.04下安装kubernetes(k8s 1.28版)
·
本教程可以作为学习用集群,不能用于生产,生产环境还需要做更多调优和设置
适合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内存使用情况。
更多推荐
已为社区贡献7条内容
所有评论(0)