版本大于1.4的开始引入这个kubeadm工具简化集群的安装过程。安装前防火墙和selllinux要关闭。并修改hostname和/etc/hosts
master 192.168.52.10
node1 192.168.52.11
node2 192.168.52.12
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭selinux
# 重启永久关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 当前环境临时关闭selinux
setenforce 0
关闭swap分区
# 临时关闭swap
swapoff -a
# 永久关闭swap
sed -ri 's/.*swap.*/#&/' /etc/fstab
将桥接的IPv4
流量传递到iptables的链
# 覆盖写入文件内容
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 配置生效
sysctl --system
时间同步
# 1、安装ntpdate
yum install ntpdate -y
# 2、手动同步时间
ntpdate time.windows.com
ntpdate ntp1.aliyun.com
# 3、定时同步时间任务
echo " */10 * * * * /usr/sbin/ntpdate -u ntp1.aliyun.com > /dev/null 2>&1 " \
>> /var/spool/cron/root
(一)安装docker
我这里使用的docker,可以参考我之前docker安装的文章。Docker学习笔记1-在centos服务器上安装docker_温殿飞的博客-CSDN博客
如果要指定版本
yum list docker-ce.x86_64 --showduplicates | sort -r
yum install -y docker-ce-cli-18.09.9
yum install -y docker-ce-18.09.9 containerd.io
安装好以后还要做一些配置来适配kubernets。 重启服务。
[root@master ~]#cat <<EOF > /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"],
"bip":"172.12.0.1/24",
"registry-mirrors": ["https://0s2uk8va.mirror.aliyuncs.com"]
}
EOF
(二)安装kubeadm
官方文档给的是geogle的网址,但是我们无法访问外网,找到了阿里的yum源。配置方法如下:
kubernetes镜像_kubernetes下载地址_kubernetes安装教程-阿里巴巴开源镜像站
cat << EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum makecache fast
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes ###这个是安装最新版的
或者
yum install -y kubeadm-1.18.20-0 kubelet-1.18.20-0 kubectl-1.18.20-0 ###这个是安装指定版本
systemctl enable kubelet && systemctl start kubelet
另外kubeadm需要关闭系统交换区,swapoff -a。
(三)修改kubeadm默认配置,并初始化kubelet服务
kubeadm的初始化控制平面(init)命令和加入节点(join)命令,都可以通过修改配置文件来修改默认参数的值。
kubeadm 配置文件将配置文件以ConfigMap的形式保存到集群里。ConfigMap是以配置文件名为key,内容为value的配置存储文件。在建模用户应用时,用户将ConfigMap作为特殊的volume在pod里挂载。在pod被调度到某个节点时,ConfigMap配置文件会被自动还原到节点本地。这样做的目的是方便后续查询和升级工作。kubeadm config子命令提供了对这组功能的支持。下面是命令说明不是安装步骤。
输出kubeadm init 命令默认参数的内容。
kubeadm config print init-defaults
输出kubeadm join 默认参数内容
kubeadm config print join-defaults
列出kubenets集群所需的镜像列表
kubeadm config images list
拉取相关镜像到本地
kubeadm config images pull
了解到上面的命令之后,我们继续进行安装的步骤,要把所需的镜像下载下来但是直接执行拉取名会报错。这是因为我们无法访问默认配置里的geogle镜像k8s.gcr.io.
解决的方法就是用国内阿里的镜像,运行的时候可能会报错。
以下是master才需要执行的的,node不需要执行。
方法一:
kubeadm config print init-defaults>kubeadm.yaml ##并做一些修改,然后执行安装
kubeadm config images pull --config=kubeadm.yaml ##拉取镜像到本地
kubeadm init --config=kubeadm.yaml 初始化kubelet服务
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.52.10 ###注意这里为master物理ip
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: master ##注意这里是你的hostname
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers ###这里改为阿里的镜像源
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12 ###这个是自动生成server组件时使用的内部ip地址。
scheduler: {}
方法二
kubeadm init --apiserver-advertise-address=192.168.52.10 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.24.4 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16
执行报错
[ERROR CRI]: container runtime is not running: output: E0823 14:06:02.138306 3154 remote_runtime.go:925] "Status from runtime service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
解决方法
-
mv /etc/containerd/config.toml /tmp/
-
systemctl restart containerd
kubeadm reset之后,再次执行上述命令又报错
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.
这是是kubelet没有启动成功:提示用下面命令看原因
systemctl status kubelet
journalctl -xeu kubelet
第二条命令的时候提示
"Failed to create cgroup" err="Cannot set property TasksAccountin
解决方法
yum update systemd
kubeadm reset之后,再次执行发现校验kubelet服务的时候又出错了并且看进程已经起来了,查看错误信息
systemctl status kubelet 查看kebelet服务状态一直报node相关的错。
journalctl -xeu kubelet | grep Failed
"Error syncing pod, skipping" err="failed to \"CreatePodSandbox\" for \"kube-scheduler-k8s-master-12_kube-system(b886b3e01aef1830d12847a83ba1b808)\" with CreatePodSandboxError: \"Failed to create sandbox for pod \\\"kube-scheduler-k8s-master-12_kube-system(b886b3e01aef1830d12847a83ba1b808)\\\": rpc error: code = Unknown desc = failed to get sandbox image \\\"k8s.gcr.io/pause:3.6\\\": failed to pull image \\\"k8s.gcr.io/pause:3.6\\\": failed to pull and unpack image \\\"k8s.gcr.io/pause:3.6\\\": failed to resolve reference \\\"k8s.gcr.io/pause:3.6\\\": failed to do request: Head \\\"https://k8s.gcr.io/v2/pause/manifests/3.6\\\": dial tcp: lookup k8s.gcr.io on [::1]:53: read udp [::1]:41965->[::1]:53: read: connection refused\"" pod="kube-system/kube-scheduler-k8s-master-12" podUID=b886b3e01aef1830d12847a83ba1b808
这个是真的巨坑,因为我安装的是最新版本1.24.0 通过命令kubeadm config images list 查到所需的pause是3.7版本,我们拉取的也是3.7版本,但是把,这个鬼玩意居然报没有3.6的错,这就是个bug。
有两种方法,一个就是下载旧的版本的pause,搜索了好像要改标签比较麻烦。
第二个方法,卸载重装,用老版本kubernetes,我使用的是v1.18.20-0,同样的命令,执行一路顺畅,终于完成了,然后非root用户使用安装提示给的命令配置$HOME/.kube 环境。事实证明新手还是要用老的版本不容易出幺蛾子。
注意安装成功的最后一段文字保留,这个是节点加入的命令。
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.52.10:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1cd547bd275b41ef904b9b8ffbd4380947ef85d02d94394ad5deb7b470b4b8fc
root用户可以使用下面一台命令配置环境变量。这个是给kubectl命令工具用的。
export KUBECONFIG=/etc/kubernetes/admin.conf
可以看到mster节点已经部署成功了
[root@master ~]# kubectl -n kube-system get configmap
NAME DATA AGE
coredns 1 65m
extension-apiserver-authentication 6 65m
kube-proxy 2 65m
kubeadm-config 2 65m
kubelet-config-1.18 1 65m
[root@master ~]#
[root@master ~]#
[root@master ~]# crictl ps
WARN[0000] runtime connect using default endpoints: [unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]. As the default settings are now deprecated, you should set the endpoint instead.
WARN[0000] image connect using default endpoints: [unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]. As the default settings are now deprecated, you should set the endpoint instead.
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID POD
d3f1cb3755cd6 43940c34f24f3 About an hour ago Running kube-proxy 0 9abadca260393 kube-proxy-4ghjf
c639fa964bd4f a31f78c7c8ce1 About an hour ago Running kube-scheduler 0 8827c83b9711a kube-scheduler-master
b092e297bf823 74060cea7f704 About an hour ago Running kube-apiserver 0 9685046f39d4a kube-apiserver-master
5baea2075fb29 303ce5db0e90d About an hour ago Running etcd 0 55ab367f7a383 etcd-master
3549ed5d01c6a d3e55153f52fb About an hour ago Running kube-controller-manager 0 6a3803a740ee1 kube-controller-manager-master
(四)部署node节点并加入集群
注意node节点不要初始化服务,其他步骤一样,配置dockeryum源,配置kubernetsyum源安装docker,kubeadm,kubelet,kubectl,直接安装完以后在node节点执行如下命令
kubeadm join 192.168.52.10:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1cd547bd275b41ef904b9b8ffbd4380947ef85d02d94394ad5deb7b470b4b8fc
也可通过kubeadm token list 查看tocken,可以看到里面有个ttl代表这个是临时的,会过期。
所以我们可以自己生成,生成以后只需要替换token的内容就可以了。
生成新的token使用命令
kubeadm token create --print-join-command
生成永不过期的token使用
kubeadm token create --ttl 0 --print-join-command
[root@master ~]# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
abcdef.0123456789abcdef 23h 2022-08-25T16:58:58+08:00 authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
kmt9dl.74h1kuahlr13i1xj <forever> <never> authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
zphgy5.2cbwm33v4tkyjrr0 23h 2022-08-25T17:33:18+08:00 authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
然后到mater服务器上执行kubectl get nodes 可以查看节点。
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 24m v1.18.20
node1 NotReady <none> 2m17s v1.18.20
我们的节点就配置上去了。
另外也可以使用yaml的方法。
kubeadm config print join-defaults >join.yaml
然后修改配置,已标红
apiVersion: kubeadm.k8s.io/v1beta2
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:
bootstrapToken:
apiServerEndpoint: 192.168.52.10:6443
token: abcdef.0123456789abcdef
unsafeSkipCAVerification: true
timeout: 5m0s
tlsBootstrapToken: abcdef.0123456789abcdef
kind: JoinConfiguration
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: master
taints: null接下来就是利用文件加入了
kubeadm join --config=join.yaml
(五)配置CNI网络插件
wget https://docs.projectcalico.org/v3.16/manifests/calico.yaml --no-check-certificate
这个文件要和版本匹配,可以查询cni匹配的版本。
修改点一:标红部分为添加
# Cluster type to identify the deployment type
- name: CLUSTER_TYPE
value: "k8s,bgp"
- name: IP_AUTODETECTION_METHOD
value: "interface=ens33"
# Auto-detect the BGP IP address.
- name: IP
value: "autodetect"
# Enable IPIP
- name: CALICO_IPV4POOL_IPIP
value: "Always"
修改点二:搜索CALICO_IPV4POOL_CIDR ,改成自己的地址段- name: CALICO_IPV4POOL_CIDR
value: "192.168.52.0/16"
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 170m v1.18.20
node1 Ready <none> 148m v1.18.20
状态变成ready就成功了
在master安装完cni再添加节点会出现,可以重新执行下mater安装cni的命令这样node节点也会变正常。
Unable to update cni config: no networks found in /etc/cni/net.d
另外如果node节点的kubelet报下面的错但是查了下这个文件存在,尝试重启docker和kubelet后解决
error: fork/exec /usr/libexec/kubernetes/kubelet-plugins/volume/exec/nodeagent~uds/uds: no such file or directory, output: ""
(六)验证集群是否工作正常。
[root@master ~]# kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-b96cdbbbf-z48xq 1/1 Running 1 14h
kube-system calico-node-8gqqr 1/1 Running 1 13h
kube-system calico-node-94cs7 1/1 Running 2 14h
kube-system coredns-7ff77c879f-7h85m 1/1 Running 1 17h
kube-system coredns-7ff77c879f-d27lm 1/1 Running 1 17h
kube-system etcd-master 1/1 Running 1 17h
kube-system kube-apiserver-master 1/1 Running 1 17h
kube-system kube-controller-manager-master 1/1 Running 2 17h
kube-system kube-proxy-p6g5g 1/1 Running 1 17h
kube-system kube-proxy-xf54z 1/1 Running 2 16h
kube-system kube-scheduler-master 1/1 Running 2 17h
一切安好,太幸福了。
权威指南里面说,如果有pod错误。
可以通过kubectl --namespace=kube-system describe pod <pod_name> 来查看。