操作系统 | IP地址 | 主机名 | 组件 |
---|---|---|---|
CentOS7.5 | 192.168.8.2 | k8s-master | kubeadm-1.18.0、kubelet-1.18.0、kubect-1.18.0 |
CentOS7.5 | 192.168.8.3 | k8s-node01 | kubeadm-1.18.0、kubelet-1.18.0、kubect-1.18.0 |
CentOS7.5 | 192.168.8.4 | k8s-node02 | kubeadm-1.18.0、kubelet-1.18.0、kubect-1.18.0 |
注意:所有主机配置推荐CPU:2核+ Master推荐Mem:4G+,Node推荐Mem2G+
架构图,本次K8S部署版本:1.18.0
所以主机执行
#所有主机建立免交互,3个主机都需要生成公私钥并公钥发送给其他主机。
[root@k8s-master ~]# ssh-keygen #一直回车,生成公钥、私钥
[root@k8s-master ~]# ll /root/.ssh/ #查看公钥文件、私钥文件、以认证主机地址
总用量 16
-rw------- 1 root root 804 9月 12 22:07 authorized_keys #保留其他公钥
-rw------- 1 root root 1675 9月 12 22:06 id_rsa #私钥文件
-rw-r--r-- 1 root root 408 9月 12 22:06 id_rsa.pub #公钥文件
-rw-r--r-- 1 root root 346 9月 12 22:07 known_hosts #以认证、已知主机
[root@k8s-master ~]# ssh-copy-id 192.168.8.3 #输入对方root用户密码,将公钥发送给8.3主机建立免交互
[root@k8s-master ~]# ssh-copy-id 192.168.8.4 #输入对方root用户密码,将公钥发送给8.4主机建立免交互
[root@k8s-node01 ~]# ssh-keygen
[root@k8s-node01 ~]# ssh-copy-id 192.168.8.2
[root@k8s-node01 ~]# ssh-copy-id 192.168.8.4
[root@k8s-node02 ~]# ssh-keygen
[root@k8s-node02 ~]# ssh-copy-id 192.168.8.2
[root@k8s-node02 ~]# ssh-copy-id 192.168.8.3
#关闭防火墙
[root@k8s-master ~]# systemctl stop firewalld
[root@k8s-master ~]# systemctl disable firewalld
#关闭SELinux
[root@k8s-master ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
[root@k8s-master ~]# setenforce 0
#关闭swap分区
[root@k8s-master ~]# swapoff -a
[root@k8s-master ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab
#配置主机名和hosts映射
[root@k8s-master ~]# hostnamectl set-hostname --static k8s-master && bash #更改主机名
[root@k8s-node01 ~]# hostnamectl set-hostname --static k8s-node01 && bash
[root@k8s-node02 ~]# hostnamectl set-hostname --static k8s-node02 && bash
[root@k8s-master ~]# cat >> /etc/hosts << EOF
192.168.8.2 k8s-master
192.168.8.3 k8s-node01
192.168.8.4 k8s-node02
EOF
[root@k8s-master ~]# scp /etc/hosts [email protected]:/etc/hosts
[root@k8s-master ~]# scp /etc/hosts [email protected]:/etc/hosts
#修改Linux内核参数
[root@k8s-master ~]# cat >> /etc/sysctl.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1 #将桥接的IPV4流量传递到iptables的链
net.bridge.bridge-nf-call-iptables = 1
EOF
[root@k8s-master ~]# sysctl -p #让内核参数立即生效
#配置时间同步
[root@k8s-master ~]# yum -y install ntpdate
[root@k8s-master ~]# ntpdate ntp.aliyun.com #阿里时钟服务器,如果在生产环境中的话需要写定时任务来定期同步
所有主机执行
[root@k8s-master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo && mv ./docker-ce.repo /etc/yum.repos.d/
[root@k8s-master ~]# yum makecache fast #建立yum缓存
[root@k8s-master ~]# yum -y install yum-utils lvm2 device-mapper-persistent-data
[root@k8s-master ~]# yum -y install docker-ce #安装docker-ce
[root@k8s-master ~]# systemctl enable --now docker
所有主机执行
很多镜像都是在国外的服务器上,由于网络问题,经常导致无法拉取镜像的错误,所以最好将镜像拉取地址设置成国内的。目前国内很多公有云提供商都提供了镜像加速服务。镜像加速配置如下。
将镜像加速器地址直接写入/etc/docker/daemon.json文件内,如果文件不存在,可直接新建文件并保存。通过该文件扩展名可以看出,daemon.json的内容符合json格式,书写时要注意。同时,由于单一镜像服务器存在不可用的情况,在配置加速器时推荐配置两个或多个加速地址。
https://hub-mirror.c.163.com //网易云加速器
https://dockerhub.azk8s.cn //Azuer中国镜像
[root@k8s-master ~]# cat << EOF >> /etc/docker/daemon.json
{ "registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://dockerhub.azk8s.cn"
]
}
EOF
[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl restart docker
[root@k8s-master ~]# docker info | tail -5
Registry Mirrors:
https://hub-mirror.c.163.com/
https://e815eh6a.mirror.aliyuncs.com/
Live Restore Enabled: false
所有主机执行
[root@k8s-master ~]# 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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
[root@k8s-master ~]# yum makecache fast #建立yum缓存
所有主机执行
kubelet刚完成安装后,通过systemctl start kubelet方式是无法启动的,需要加入节点或初始化master后才可以启动成功。如果在命令执行过程中出现索引gpg检查失败的情况,可以使用yum -y install --nogpgcheck kubelet kubeadm kubectl来安装。
[root@k8s-master ~]# yum -y install kubeadm-1.18.0 kubectl-1.18.0 kubelet-1.18.0
[root@k8s-master ~]# systemctl enable kubelet
master端执行
以下字段解释
–apiserver-advertise-address:定义master端IP地址。
–image-repository:指向国内的镜像仓库,这里使用阿里云的。
–kubernetes-version:定义k8s版本要和yum安装的版本一直,不然会报错。
–service-cid:定义k8s中Service地址范围。
–pod-network-cidr:定义k8s中Pod地址范围
[root@k8s-master ~]# kubeadm init \
--apiserver-advertise-address=192.168.8.2 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
以上操作会拉取:kube-apiserver、kube-controller-manager、kube-scheduler并部署安装前检查、初始化K8S集群、拉取K8S相关组件、部署启动组件。由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
根据提示操作
kubectl默认会在执行的用户家目录下面的.kube目录下寻找config文件。这里是将在初始化时[kubeconfig]步骤生成的admin.conf拷贝到.kube/config
复制k8s初始化后终端上输出的命令,并执行。
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubeadm init主要执行了以下操作
[init]:指定版本进行初始化操作。
[preflight]:初始化前的检查和下载所需的Docker镜像文件。
[kubelet-start]:生成kubelet的配置件”/var/lib/kubelet/config.yaml”,没有这个文件kubelet无法启动,所以初始化之前的kubelet实际上启动失败。
[certificates]:生成kubernetes使用的证书,存放在/etc/Kubernetes/pki目录中。
[kubeconfig]:生成Kubeconfig文件,存大在/etc/Kubernetes目录中,组件之间通信要使用对应文件。
[control-plane]:使用/etc/Kubernetes/manifest目录下的YAML文件,安装Master组件。
[etcd]:使用/etc/Kubernetes/manifest/etcd.yaml安装Etcd服务。
[wait-control-plane]:等待control-plan部署的Master组件启动。
[apiclient]:检查Master组件服务状态。
[uploadconfig]:更新配置。
[kubelet]:使用configMap配置kubelet。
[patchnode]:更新CNl信息到Node上,通过注释的方式记录
[mark-control-plane] :为当前节点打标签,打了角色的Master,和不可调度标签,这样默认就不会使用Master节点来运行Pod。
[bootstrap-token]:生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到。
[addons]:安装附加组件CoreDNS和kube-proxy。
kubeadm通过初始化安装是不包括网络插件的,也就是说初始化之后是不具备相关网络功能的,比如k8s-master节点上查看节点信息都是”Not Ready”状态、Pod的CoreDNS无法提供服务等。
master端执行
安装完master节点后会自动生成一下token,有效期24小时,所有需要重新创建一个永久token。
如下所示。
安装完master节点后,token信息示例,该token会在master初始化完毕后在终端显示,先不要复制执行。
kubeadm join 192.168.8.2:6443 --token ev9rs3.nelq7yugehwkzmzl \
--discovery-token-ca-cert-hash sha256:4605d3efa9f04b561ca4660a855779f8855a1c7999d5166590ec5e40a1374f0d
使用命令查看token信息
[root@k8s-master ~]# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
ev9rs3.nelq7yugehwkzmzl 23h 2021-09-13T22:56:31+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
有效期还有23小时,23h
创建永久性token
[root@k8s-master ~]# kubeadm token create --ttl 0 --print-join-command
kubeadm join 192.168.8.2:6443 --token sg2voo.7u8ifc4ymhwqe25o --discovery-token-ca-cert-hash sha256:4605d3efa9f04b561ca4660a855779f8855a1c7999d5166590ec5e40a1374f0d
再次查看token信息
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
ev9rs3.nelq7yugehwkzmzl 23h 2021-09-13T22:56:31+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
kiqurj.aytxdn8gbq0p992i <forever> <never> authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
sg2voo.7u8ifc4ymhwqe25o <forever> <never> authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
vbq6si.8g6p1pxa6di74olx <forever> <never> authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
可以看到“sg2voo.7u8ifc4ymhwqe25o......token的标识为forever(永久)。
所有node主机上执行
将master生成的永久性token复制到要加入到K8S集群中的机器上执行。
最后提示:Run ‘kubectl get nodes’ on the control-plane to see this node join the cluster. 添加成功,则为添加成功。
[root@k8s-node01 ~]# kubeadm join 192.168.8.2:6443 --token sg2voo.7u8ifc4ymhwqe25o --discovery-token-ca-cert-hash sha256:4605d3efa9f04b561ca4660a855779f8855a1c7999d5166590ec5e40a1374f0d
[root@k8s-node02 ~]# kubeadm join 192.168.8.2:6443 --token sg2voo.7u8ifc4ymhwqe25o --discovery-token-ca-cert-hash sha256:4605d3efa9f04b561ca4660a855779f8855a1c7999d5166590ec5e40a1374f0d
在Master端查看集群状态
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady master 10m v1.18.0
k8s-node01 NotReady <none> 5m16s v1.18.0
k8s-node02 NotReady <none> 5m14s v1.18.0
可以看到各个节点之间的状态为NotReady,这是因为没有安装网络插件导致的,接下来安装网络插件CNI
Master端执行
master节点NotReady和pod coredns不可用的的原因就是因为没有使用任何的网络插件,此时Master的连接还不正常。目前最流行的kubernetes网络插件有 Flannel、Calico、Canal、Weave,这里选择Flannel插件。
[root@k8s-master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml #下载flannel.yml文件,如果下载失败可以使用windows主机下载,然后在上次至服务器内。
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml #执行flannel-yml文件
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
查看所有Pod状态
[root@k8s-master ~]# kubectl get pods --all-namespaces #查看所有命名空间内的Pod
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7ff77c879f-j2jnk 1/1 Running 0 18m
kube-system coredns-7ff77c879f-tl62r 1/1 Running 0 18m
kube-system etcd-k8s-master 1/1 Running 1 18m
kube-system kube-apiserver-k8s-master 1/1 Running 1 18m
kube-system kube-controller-manager-k8s-master 1/1 Running 1 18m
kube-system kube-flannel-ds-d7d8q 1/1 Running 0 5m53s
kube-system kube-flannel-ds-fzqph 1/1 Running 0 5m53s
kube-system kube-flannel-ds-vccnw 1/1 Running 0 6s
kube-system kube-proxy-kkzmr 1/1 Running 0 13m
kube-system kube-proxy-psmfp 1/1 Running 0 13m
kube-system kube-proxy-t6frp 1/1 Running 1 18m
kube-system kube-scheduler-k8s-master 1/1 Running 1 18m
查看Node节点状态
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 19m v1.18.0
k8s-node01 Ready <none> 14m v1.18.0
k8s-node02 Ready <none> 14m v1.18.0
可以看到Pod、Node状态都是正常的
发布一个资源nginx
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx #创建nginx 资源deployment
deployment.apps/nginx created
[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort #暴露端口
service/nginx exposed
[root@k8s-master ~]# kubectl get svc 查看service,默认命名空间为default
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 21m
nginx NodePort 10.100.132.231 <none> 80:30254/TCP 16s
使用K8S集群中的任意节点IP+31829端口访问都可以访问该nginx-service。
任意集群主机地址+30254