服务器规划
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版本说明:
环境准备
# 根据规划设置主机名
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

如上图图,信息不少。解释说明如下:
你的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:0cbd1fe71f7ec93f519eabdcaf47a257785f411365e915f08072eb81c575f99cnode节点结束 <<<
继续master节点运行查看加入的node节点
NotReady是因为网络插件,继续
# 获取node节点
kubectl get nodes
如上图,现在所有节点是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
测试集群
在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已经运行
部署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-namespacesdashboard 服务的 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。
创建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登陆成功

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)