Kubernetes(K8S)环境搭建(kubeadm)

Kubernetes(K8S)环境搭建(kubeadm)

卖萌小老头
2022-10-03 / 0 评论 / 410 阅读 / 正在检测是否收录...

服务器规划

k8s-master:10.11.26.81
k8s-node1:10.11.26.82
k8s-node2:10.11.26.83

软件环境

操作系统:centos7.4
内核版本:3.10.0-693.el7.x86_64
Docker:18.09.9
K8S:1.23.0
Calico:v3.24

Calico版本说明:
Calico

环境准备

# 根据规划设置主机名
hostnamectl set-hostname <hostname>

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config

# 关闭swap分区    
swapoff -a # 临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久关闭

# host对应关系
cat >> /etc/hosts <<EOF
10.11.26.81 k8s-master
10.11.26.82 k8s-node1
10.11.26.83 k8s-node2
EOF

# 将桥接的IPv4流量传递到iptables的链
# 以下net.ipv4.ip_forward如存在=0,修改为1即可
cat > /etc/sysctl.d/k8s.conf <<EOF
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle = 0
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
EOF
#net.ipv6.conf.all.disable_ipv6=1
#net.ipv6.conf.all.forwarding=1
#net.ipv6.conf.lo.disable_ipv6=1
#net.ipv6.conf.default.disable_ipv6=1

# 生效
sysctl --system

# 时间同步
yum install ntpdate -y
ntpdate time.windows.com

所有节点安装Docker、kubeadm、kubelet

安装docker

# 更新软件包和系统内核
yum -y update

# 卸载旧版本
yum remove docker  docker-common docker-selinux docker-engine

# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2

# 设置yum源
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 查看可用版本
yum list docker-ce --showduplicates | sort -r

# 选定版本安装
yum -y install docker-ce-19.03.9

# 启动并设置开机启动
systemctl enable docker && systemctl start docker

# 查看版本
docker version

# 配置镜像加速,cgroup驱动等
cat > /etc/docker/daemon.json <<EOF
{
  "graph": "/data/docker",
  "registry-mirrors": ["https://q4r4fe9a.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

# 重启docker
systemctl restart docker

# 查看docker信息,进行确认
docker info

安装kubeadm、kubelet

# 添加k8s阿里软件源
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

# 安装
yum install -y \
  kubelet-1.23.0 \
  kubeadm-1.23.0 \
  kubectl-1.23.0

# 启动
systemctl enable kubelet && systemctl start kubelet

部署k8smaster和node节点

>>> master节点

kubeadm部署

# 部署
kubeadm init \
  --apiserver-advertise-address=10.11.26.81 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.23.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.240.0.0/16 \
  --ignore-preflight-errors=all

<<<< 参数说明 >>>>

--apiserver-advertise-address API Server将要广播的监听地址。如指定为 0.0.0.0 将使用缺省的网卡地址。
--image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
--kubernetes-version 为control plane选择一个特定的Kubernetes版本。缺省值: "stable-1"
--service-cidr 集群内部虚拟网络,Pod统一访问入口,缺省值: "10.96.0.0/12"
--pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致。如果设置了这个参数,control plane将会为每一个节点自动分配CIDRs。
--apiserver-bind-port int32 API Server绑定的端口。缺省值: 6443
--apiserver-cert-extra-sans stringSlice 可选的额外提供的证书主题别名(SANs)用于指定API Server的服务器证书。可以是IP地址也可以是DNS名称。
--cert-dir string 证书的存储路径。缺省值: "/etc/kubernetes/pki"
--config string kubeadm配置文件的路径。警告:配置文件的功能是实验性的。
--cri-socket string 指明要连接的CRI socket文件。缺省值: "/var/run/dockershim.sock"
--dry-run 不会应用任何改变;只会输出将要执行的操作。
--feature-gates string 键值对的集合,用来控制各种功能的开关。可选项有:Auditing=true|false (当前为ALPHA状态 - 缺省值=false),CoreDNS=true|false (缺省值=true),DynamicKubeletConfig=true|false (当前为BETA状态 - 缺省值=false)
-h, > --help 获取init命令的帮助信息
--ignore-preflight-errors stringSlice 忽视检查项错误列表,列表中的每一个检查项如发生错误将被展示输出为警告,而非错误。 例如: 'IsPrivilegedUser,Swap'. 如填写为 'all' 则将忽视所有的检查项错误。
--node-name string 指定节点的名称。
--service-dns-domain string 为services另外指定域名, 例如: "myorg.internal"。缺省值: "cluster.local"
--skip-token-print 不打印出由 kubeadm init 命令生成的默认令牌。
--token string 这个令牌用于建立主从节点间的双向受信链接。格式为 [a-z0-9]{6}.[a-z0-9]{16} - 示例: abcdef.0123456789abcdef
--token-ttl duration 令牌被自动删除前的可用时长 (示例: 1s, 2m, 3h). 如果设置为 '0', 令牌将永不过期。缺省值: 24h0m0s

生成的join命令
如上图图,信息不少。解释说明如下:

你的Kubernetes 控制平面已经安装成功!
开始使用集群前,你需要用普通用户执行mkdir... 或者你是root用户,执行export...
现在应该讲pod网络部署到集群,执行“ kubectl apply -f [podnetwork].yaml ”,其中一个选项列在:https://kubernetes.io/docs/concepts/cluster-administration/addons/
然后你可以加入任意数量的工作节点,在每个工作节点上以root身份运行以下命令:kubeadm join...

kubeadm部署后,会输出一个join命令,先复制出来,node节点加入master会使用。

在运行 kubeadm init 之前可以先执行 kubeadm config images pull 来测试与 gcr.io 的连接,kubeadm config images pull尝试是否可以拉取镜像,由于国内访问"k8s.gcr.io", "gcr.io", "quay.io" 有困难,这里采用自建docker register的方式

构建私有镜像
docker pull registry
docker run --restart=always -d -p 15000:5000 -v /home/registry:/var/lib/registry registry
# 本次生成的(node节点执行需要用到)
kubeadm join 10.11.26.81:6443 --token ue0jg3.ya6n9z8zfx213xnk \
    --discovery-token-ca-cert-hash sha256:0cbd1fe71f7ec93f519eabdcaf47a257785f411365e915f08072eb81c575f99c

# 默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成
kubeadm token create --print-join-command

配置 kubectl

# 如上图和说明,拷贝k8s认真文件
# 非root用户执行
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# root用户可执行
export KUBECONFIG=/etc/kubernetes/admin.conf

注:以后所有yaml文件都只在Master节点执行。

安装目录:/etc/kubernetes/

组件配置文件目录:/etc/kubernetes/manifests/

node节点开始 >>>

node节点执行master节点生成的join命令

# 这里复制master生成的一串命令(如果已过期,需要重新生成,请看文章上边的说明)
kubeadm join 10.11.26.81:6443 --token ue0jg3.ya6n9z8zfx213xnk \
    --discovery-token-ca-cert-hash sha256:0cbd1fe71f7ec93f519eabdcaf47a257785f411365e915f08072eb81c575f99c

node节点结束 <<<

继续master节点运行查看加入的node节点

NotReady是因为网络插件,继续

# 获取node节点
kubectl get nodes

NotReady
如上图,现在所有节点是NotReady,需要安装网络插件,master节点部署时提到过。

安装网络插件(CNI)

在上述操作完成后,各个工作节点已经加入了集群,但是它们的状态都是 NoReady,这是由于无它们无法跨主机通信的原因。而 CNI 网络插件的主要功能就是实现 pod 资源能够跨宿主机进行通信。在master节点中执行以下命令进行配置,不同版本的可能会不兼容,具体请参考:

https://projectcalico.docs.tigera.io/about/about-calico
https://projectcalico.docs.tigera.io/releases

# 下载配置文件
wget https://docs.projectcalico.org/manifests/calico.yaml

# 下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样。

# 修改完成部署(过程可能会失败)
kubectl apply -f calico.yaml
kubectl get pod --all-namespaces -o wide

# 执行结束要等上一会才全部running
kubectl get pods -n kube-system 

以上操作执行完成后,master节点执行kubectl get nodes,可以看到status ready
Ready

测试集群

在Kubernetes集群中创建一个pod,验证是否正常运行
创建一个pod,开放对外端口访问,这里会随机映射一个端口

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort

查看pod状态,必须是running状态而且ready是1,并查看nginx svc的80端口映射到了哪个端口

kubectl get pod,svc

nginx状态

访问任意机器的刚刚查看的映射端口,看看是否nginx已经运行
任意节点IP+端口就能访问nginx

部署Dashboard

Dashboard是官方提供的一个UI,可用于基本管理K8s资源。

由于 K8s 版本不同,具体去这里查看对应的版本:

https://github.com/kubernetes/dashboard/releases

当前可用支持版本2.5.0

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml

构建Pod

kubectl apply -f recommended.yaml

查看 Pod 状态

kubectl get pods --all-namespaces | grep dashboard
kubectl get svc --all-namespaces

dashboard 服务的 namespace 是 kubernetes-dashboard,但是该服务的类型是ClusterIP,不便于我们通过浏览器访问,因此需要改成 NodePort 类型的,删除现有的 dashboard 服务

kubectl delete service kubernetes-dashboard --namespace=kubernetes-dashboard

创建配置文件dashboard-svc.yaml,内容如下:

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001
  selector:
    k8s-app: kubernetes-dashboard

创建service

kubectl apply -f dashboard-svc.yaml 

再次查看服务

kubectl get svc --all-namespaces

结果如下图:

访问地址:https://NodeIP:30001,需要Token才能登陆哦。继续往下创建用户获取授权Token。
需要Token才能登陆哦

创建service account并绑定默认cluster-admin管理员集群角色

# 创建用户
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}')

# 本次得到Token
eyJhbGciOiJSUzI1NiIsImtpZCI6InZLS292Q0UwRlNFUGRwRU9ySWlYNkRESkZNcjhpQ3Nic1kyM0hPdnNlV28ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tNGM2NDkiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYTQ3ODE5MzgtZDJiZi00MTEyLTlkMTUtNjk3YThiZTJhNDc5Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.0XTLd8Zgi1R44LmJhMhYdu1GqmihKr0ePtXFtLXQm9ddckHyrr-bWdlW50ppqikdVKCjC9cxrNcYKOvXWO1iqo1wsh89MHlXSMihyfl35BAig-hZbGAZWrmpyEawGwiS22dcS3t6iyvZDqkRriZ1-Zch8gRPol9P5gmtzv1AN62w0oJyTbHTK9emKymRyGU_eSKKGv12jmP0y1_ko40SAAh37CebDYrNo_tKcLeHxMJUVvVIxteqpV8C60tf15xSBaEt9g0fdvEXg0D84Pe314B-B5t7jmwrtbLR8EhukMV2Ngp2pKU6Q-fxjdx27WTDwOOvB5ohVJgQySMnc271hA

创建用户获取token

输入token登陆成功

k8s管理界面

k8s常用命令

# 启动一个 Kubernetes 主节点
kubeadm init 

# 启动一个 Kubernetes 工作节点并且将其加入到集群
kubeadm join 

# 更新一个 Kubernetes 集群到新版本
kubeadm upgrade 

# 如果使用 v1.7.x 或者更低版本的 kubeadm 初始化集群,您需要对集群做一些配置以便使用 kubeadm upgrade 命令
kubeadm config 

# 管理 kubeadm join 使用的令牌
kubeadm token 

# 还原 kubeadm init 或者 kubeadm join 对主机所做的任何更改
kubeadm reset 

# 查看pod,service,endpoints,secret等等的状态
kubectl get 组件名      # 例如kubectl get pod   查看详细信息可以加上-o wide   其他namespace的指定 -n namespace名

# 创建,变更一个yaml文件内资源,也可以是目录,目录内包含一组yaml文件(实际使用中都是以yaml文件为主,直接使用命令创建pod的很少,推荐多使用yaml文件)
kubectl apply -f xxx.yaml    # 例如kubectl apply -f nginx.yaml   这里是如果没有则创建,如果有则变更,比create好用

# 删除一个yaml文件内资源,也可以是目录,目录内包含一组yaml文件
kubectl delete -f xxx.yaml    # 例如kubectl delete -f nginx.yaml

# 查看资源状态,比如有一组deployment内的pod没起来,一般用于pod调度过程出现的问题排查
kubectl describe pod pod名     # 先用kubectl get pod查看  有异常的复制pod名使用这个命令

# 查看pod日志,用于pod状态未就绪的故障排查
kubectl logs pod名     # 先用kubectl get pod查看  有异常的复制pod名使用这个命令

# 查看node节点或者是pod资源(cpu,内存资源)使用情况
kubectl top 组件名     # 例如kubectl top node  kubectl top pod

# 进入pod内部
kubectl exec -ti pod名 /bin/bash      # 先用kubectl get pod查看  有需要的复制pod名使用这个命令
0

评论 (0)

取消