k8s集群安装-kubeadm安装
k8s集群安装-kubeadm安装
xiaoxin-topkubeadm 安装集群
准备工作
角色 | IP | 组件 |
---|---|---|
k8s-master | 192.168.1.20 | kube-apiserver,kube-controller-manager,kube-scheduler,docker, etcd |
k8s-node01 | 192.168.1.18 | kubelet,kube-proxy,docker, etcd |
k8s-node02 | 192.168.1.19 | kubelet,kube-proxy,docker, etcd |
- docker版本:docker-ce 20.10.9
- kubernetes版本:v1.21.4
1 | 1、关闭防火墙 |
docker安装
centos
1 | # 1、下载阿里 的docker-ce镜像源仓库文件: |
ubuntu
1 | # 1. 安装GPG证书 |
kubeadm
简介
作用:将kuberenets大部分组件都容器化,通过StaticPod方式运行,并自动化了大部分的集群配置及认证等工作,简单几步即可搭建一个可用k8ss的集群。
kubeadm init:master 节点创建
- 检查当前机器是否合规
- 自动生成集群运行所需的各类证书及各类配置,并将master节点信息保存在名为cluster-info的ConfigMap中
- 通过Static Pod方式,运行API server、controller manager 、scheduler及etcd组件。
- 生成Token以便其他节点加入集群
kubeadm join:node 节点加入集群
节点通过token访问kube-apiserver,获取cluster-info中信息,主要是apiserver的授权信息(节点信任集群)。
通过授权信息,kubelet可执行TLS bootstrapping,与apiserver真正建立互信任关系(集群信任节点)。
安装组件(kubelet kubeadm kubectl)
centos
1 | # 1、新建repo文件: |
ubuntu
1 | # 1. 安装GPG证书 |
集群的安装
master节点
初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15kubeadm init \
--apiserver-advertise-address=192.168.1.20 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.21.4 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
# 对应参数含义:
# 节点ip
# 镜像仓库
# 版本
# service网段 默认
# pod网段 默认
# 忽略检查输出结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
Your Kubernetes control-plane has initialized successfully!
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.1.20:6443 --token mutg2q.34gp9f77hfm3mzqt \
--discovery-token-ca-cert-hash sha256:5aafdb66ba0d96855c0ec8a59577d4e7b3ba81e2f58069b9b407a0059998372e根据提示,创建 kubectl 认证文件:
1
2
3
4# 即使是root用户,也采用默认文件方式
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/configkubectl 命令补齐:
1
2
3
4echo "source <(kubectl completion bash)" >> ~/.bashrc
# 立即生效
source <(kubectl completion bash)
Node 节点
- 加入集群:
- 在node01和node02节点执行
- 根据上面的输出,执行加入命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38# 在node上执行(ip不用改)
kubeadm join 192.168.1.20:6443 --token mutg2q.34gp9f77hfm3mzqt \
--discovery-token-ca-cert-hash sha256:5aafdb66ba0d96855c0ec8a59577d4e7b3ba81e2f58069b9b407a0059998372e
# 注意:如果某个节点报错:(这是kubelet报错导致无法启动)
报错1)
Failed to run kubelet" err="failed to run Kubelet: misconfiguration: kubelet cgroup driver: \"systemd\" is different from docker cgroup driver: \"cgroupfs\"
# 在报错的节点上查看:
docker info | grep Cgroup
Cgroup Driver: cgroupfs #不是systemd ,因为有些系统不支持cgroupfs ,所以要改为systemd
Cgroup Version: 1
# 修改Cgroup Driver:
# 在/etc/docker/daemon.json中添加如下内容(如果没有创建)- 可看 上面的安装docker第7步:
{
"exec-opts":["native.cgroupdriver=systemd"]
}
为什么要修改为使用systemd?
Kubernetes 推荐使用 systemd 来代替 cgroupf
因为systemd是Kubernetes自带的cgroup管理器, 负责为每个进程分配cgroups,
但docker的cgroup driver默认是cgroupfs,这样就同时运行有两个cgroup控制管理器,
当资源有压力的情况时,有可能出现不稳定的情况
报错2):
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR FileAvailable--etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists
[ERROR Port-10250]: Port 10250 is in use
[ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
- 解决:(注意是在node节点上执行)
如果你正在重新初始化一个 Kubernetes 集群,可以使用 kubeadm reset 命令来清理先前的设置。
sudo kubeadm reset
以下这个情况是在token过期时操作或后续新增节点时,需要重新生成token。
- token 过期: kubeadm join 加入集群时,需要2个参数,–token与–discovery-token-ca-cert-hash。其中,token有限期一般是24小时,如果超过时间要新增节点,就需要重新生成token。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查询token(在master上操作)
kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
mutg2q.34gp9f77hfm3mzqt 23h 2024-07-03T22:43:22+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
# 创建 token
kubeadm token create
token:l0r2mh.0z5aojdur71posxt
# discovery-token-ca-cert-hash token的hash值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
5aafdb66ba0d96855c0ec8a59577d4e7b3ba81e2f58069b9b407a0059998372e
# 新节点加入(比如新增节点或者原先节点未加入)
kubeadm join 192.168.80.20:6443 --token l0r2mh.0z5aojdur71posxt \
--discovery-token-ca-cert-hash sha256:5aafdb66ba0d96855c0ec8a59577d4e7b3ba81e2f58069b9b407a0059998372e
网络插件安装
未安装网络插件,节点没有 Ready
1
2
3
4
5kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 41m v1.21.4
k8s-node01 NotReady <none> 35m v1.21.4
k8s-node02 NotReady <none> 8m21s v1.21.4安装 flannel:
如果无法拉取镜像:
参考:docker配置代理篇的老方法配置 proxy.conf1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29# 下载网络插件yaml文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 确保网络配置与 `--pod-network-cidr=10.244.0.0/16` 一致
vi kube-flannel.yml
net-conf.json: |
{
"Network": "10.244.0.0/16",
# 应用网络插件
kubectl apply -f kube-flannel.yml
# 查看网络插件pod
- 默认每个节点都会跑一个flannel 的pod、才能让集群正常
kubectl get pod -n kube-flannel
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-flannel-ds-nkjbh 1/1 Running 0 103s 192.168.1.18 k8s-node01 <none> <none>
kube-flannel-ds-qs9sz 1/1 Running 0 103s 192.168.1.20 k8s-master <none> <none>
kube-flannel-ds-xsg6c 1/1 Running 0 103s 192.168.1.19 k8s-node02 <none> <none>
# 查看节点状态
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 43m v1.21.4
k8s-node01 Ready <none> 33m v1.21.4
k8s-node02 Ready <none> 32m v1.21.4
ipvs
- 开启 kube-proxy 协议为 ipvs(master上操作)
1 | kubectl edit configmap kube-proxy -n kube-system |
集群状态
集群状态异常:
1
2
3
4
5$ kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
controller-manager Unhealthy Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused
etcd-0 Healthy {"health":"true"}原因:使用了非安全端口。按如下方法修改(master上操作)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30$ vi /etc/kubernetes/manifests/kube-scheduler.yaml
...
spec:
containers:
- command:
- kube-scheduler
- --kubeconfig=/etc/kubernetes/scheduler.conf
- --leader-elect=true
#- --port=0 # 注释掉
image: k8s.gcr.io/kube-scheduler:v1.18.6
$ vi /etc/kubernetes/manifests/kube-controller-manager.yaml
...
spec:
containers:
- command:
- kube-controller-manager
- --node-cidr-mask-size=24
#- --port=0 # 注释掉
- --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
# 重启kubelet
$ systemctl restart kubelet
# 再次查询状态
$ kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果