# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久,重启后生效
setenforce 0 # 临时
# 关闭swap
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
# 根据规划设置主机名(三台主机)
hostnamectl set-hostname <hostname>
# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.1.47 k8s-master1
192.168.1.48 k8s-node1
192.168.1.52 k8s-node2
EOF
# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
# 加入这个是为了防止在node节点加入集群中报相关错误
# (错误如下--"[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1")
net.ipv4.ip_forward = 1
EOF
sysctl --system # 生效
# 时间同步
yum install ntpdate -y
ntpdate time.windows.com
这里使用Docker作为容器引擎,也可以换成别的,例如containerd
# 三台机器都要操作
# 安装Docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl enable docker && systemctl start docker
# 配置镜像下载加速器
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
systemctl restart docker
docker info
# 添加阿里云YUM软件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
# 安装kubeadm,kubelet和kubectl(kubectl一般在master节点装就可以的)
yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0
systemctl enable kubelet
在master上执行
kubeadm init \
--apiserver-advertise-address=192.168.1.47 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.21.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
或者编辑一个conf文件
vi kubeadm.conf
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.21.0
imageRepository: registry.aliyuncs.com/google_containers
networking:
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
# 配置好后直接应用即可
kubeadm init --config kubeadm.conf --ignore-preflight-errors=all
参数 | 含义 |
---|---|
–apiserver-advertise-address | 集群通告地址 |
–image-repository | 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址 |
–kubernetes-version | K8s版本,与上面安装的一致 |
–service-cidr | 集群内部虚拟网络,Pod统一访问入口 |
–pod-network-cidr | Pod网络,与下面部署的CNI网络组件yaml中保持一致 |
之后的所有yaml文件都在master上执行即可
# 在master上执行即可
wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
# 下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样。
[root@k8s-master1 ~]# vim calico.yaml
- name: CALICO_IPV4POOL_CIDR
# 网段改成和之前设置一样的
value: "10.244.0.0/16"
# 改完之后部署
kubectl apply -f calico.yaml
kubectl get pods -n kube-system
拉去镜像中,等待即可
经过漫长的等待,看到calico组件都Running了,但是croedns组件拉去镜像失败,那就需要手动拉下了
先使用命令查看日志"kubectl describe pods coredns-545d6fc579-48nzz -n kube-system"
得到如下结果
# 手动拉取镜像(三个节点都需要执行)
docker pull registry.aliyuncs.com/google_containers/coredns:1.8.0
# 因为tag名不一样需要修改tag
docker tag registry.aliyuncs.com/google_containers/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
这样子就ok啦
遇到的其他报错(这个是我在重启之后报的错误)
过会儿之后他有变成了CrashLoopBackOff状态,他会一直重启
上日志
解决:
查看该pod是在那个节点运行(k8s-node1节点),并查看该节点的对应容器的状态(可以看出这个容器是退出状态)
停掉node1节点的kubelet,不然删掉他就会自己拉起来
然后停容器+删容器
重启kubelet,让他自己去重构pod
master查看状态,好啦
# 各个节点执行以下命令(所有节点都需要执行)
kubeadm reset
# 然后master节点重新执行init命令,node节点重新执行join命令
参考链接
# 修改如下内容
[root@k8s-master mysql]# kubectl edit daemonset calico-node -n kube-system
- name: IP_AUTODETECTION_METHOD
value: "interface=ens*"
# 在Kubernetes集群中创建一个nginx的pod,验证是否正常运行
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
# 默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部
vi recommended.yaml
...
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
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
# 创建token
# 创建用户
kubectl create serviceaccount dashboard-admin -n kube-system
# 用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 获取用户Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
# 将输出的结构复制到dashboard即可
k8s遇到的一些小问题
# 修改一下两个配置文件,--port=0都注释掉
# 这两个文件是这两个组件的配置文件,默认不启用的
[root@k8s-master1 ~]# vim /etc/kubernetes/manifests/kube-controller-manager.yaml
[root@k8s-master1 ~]# vim /etc/kubernetes/manifests/kube-scheduler.yaml
[root@k8s-master1 ~]# yum -y install bash-completion.noarch
[root@k8s-master1 ~]# source <(kubectl completion bash)
# 这样即可补全命令
查看master组件状态
[root@k8s-master1 ~]# kubectl get cs
# cs全拼componentstatuses,可以使用kubectl api-resources查看,别名和全拼
查看node状态
kubectl get node
查看资源的详情
# 如果没有所在名称空间不写即可
kubectl describe <资源类型> <资源名称> -n <资源所在的名称空间>
查看资源信息
#wide显示详情,yaml以yaml格式输出
kubectl get <资源类型> <资源名称> -o wide/yaml
# 使用这条命令查看
[root@k8s-master1 ~]# kubectl api-resources
# 查看结果
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
k8s中目前提供的CRI是docker shim,当然也是兼容其他容器运行时的
将docker替换为其他的容器运行时,这里使用Containerd
# 查看是否加载overlay模块(默认是加载的)
[root@k8s-master1 ~]# lsmod | grep overlay
overlay 71964 12
[root@k8s-master1 ~]# lsmod | grep br_netfil
br_netfilter 22256 0
bridge 151336 1 br_netfilter
# 为了防止出错,还是先配置以下较好
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
# 安装containerd
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum install -y containerd.io
mkdir -p /etc/containerd
# 自己生产一个配置文件(他是有自己的配置文件的,但是自己的配置文件参数太少了,需要手动生成一个)
containerd config default > /etc/containerd/config.toml
# 修改配置文件
vim /etc/containerd/config.toml
# 找到以下内容并修改成和我一样的设置
# pause镜像设置过阿里云镜像仓库地址
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"
...
# 在这个选项之下添加SystemdCgroup
# cgroups驱动设置为systemd
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
...
# 拉取Docker Hub镜像配置加速地址设置为阿里云镜像仓库地址
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://b9pmyelo.mirror.aliyuncs.com"]
# 重启containerd
systemctl restart containerd
# 配置kubelet使用containerd
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --cgroup-driver=systemd
# 重启kubelet
systemctl restart kubelet
在master上查看节点使用的CRI,发现node2已经变为了containerd了
这里说下containerd我个人感觉还不是很成熟,而且现在企业中常用的kubernets版本都在1.20以下,而k8s官网说1.23才会弃用,所以这个当作了解即可
像把他换回去也简单,修改/etc/sysconfig/kubelet将刚刚加入的配置去掉后重启即可