1. 一个master、一个node、查看node节点是主机名
  2.  
  3. # 安装顺序:先在test1 上安装完必要组件后,就开始在 test2 上单独安装node组件,实现node功能,再返回来配置test1加入集群,实现node功能
  4.  
  5. # 本实验 test1 节点不做安装kubelet组件。只有安装启动了kubelet才会生成csr,kube-apiserver通过csr请求后才会成为一个node。所以是node节点单独安装
  6.  
  7. # 注意:准备了三台,这三台都做了环境准备,但是k8s集群只是使用了 test1、test2这两个节点,如果把test3扩容进来,随时都可以,
  8.  
  9. # 注意:本实验 test2 没有安装etcd,之前安装的etcd给剔除了
  10.  
  11. # 本实验 kubelet组件的参数中 --hostname-override= 写的ip地址,通过 kubectl get nodes 查看得到的name就是ip,如果填写主机名,得到的name就是主机名
  12.  
  13. 实验架构:
  14.  
  15. # 注意:下面列出来的组件顺序就是本实验的组件安装顺序
  16.  
  17. test1: 192.168.0.91 etcdkubectl工具、kube-apiserverkube-controller-managerkube-schedulerkubelet组件、cnikube-proxy
  18.  
  19. test2: 192.168.0.92 dockerkubectl工具、kubelet组件、cnikube-proxyflannelcoredns
  20.  
  21. test3192.168.0.93
  22.  
  23. 1、环境配置
  24.  
  25. # 如下操作在所有节点操作
  26.  
  27. 修改主机名
  28.  
  29. # 注意修改 各自节点对应的 主机名
  30.  
  31. sed -i '$a\hostname=test1' /etc/hostname
  32. sed -i '$a\hostname=test1' /etc/sysconfig/network && hostnamectl set-hostname test1
  33.  
  34. 配置hosts解析
  35.  
  36. cat >>/etc/hosts<<EOF
  37. 192.168.0.91 test1
  38. 192.168.0.92 test2
  39. 192.168.0.93 test3
  40. EOF
  41.  
  42. 禁用selinux
  43.  
  44. sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
  45.  
  46. sed -i 's/enforcing/disabled/g' /etc/selinux/config
  47.  
  48. 关闭swap
  49.  
  50. # 注释/etc/fstab文件里swap相关的行
  51.  
  52. sed -i 's/\/dev\/mapper\/centos-swap/#\/dev\/mapper\/centos-swap/g' /etc/fstab
  53.  
  54. 关掉防火墙
  55.  
  56. systemctl stop firewalld && systemctl disable firewalld
  57.  
  58. 配置免密登录
  59.  
  60. 退出xshell查看主机名是否改变(必须)
  61.  
  62. exit
  63.  
  64. 开启forward
  65.  
  66. iptables -P FORWARD ACCEPT
  67.  
  68. 配置转发相关参数
  69.  
  70. cat > /etc/sysctl.d/k8s.conf <<EOF
  71. net.bridge.bridge-nf-call-ip6tables = 1
  72. net.bridge.bridge-nf-call-iptables = 1
  73. vm.swappiness=0
  74. EOF
  75.  
  76. 加载系统参数
  77.  
  78. sysctl --system
  79.  
  80. 加载ipvs相关内核模块
  81.  
  82. # 如果重新开机,需要重新加载
  83.  
  84. modprobe ip_vs
  85. modprobe ip_vs_rr
  86. modprobe ip_vs_wrr
  87. modprobe ip_vs_sh
  88. modprobe nf_conntrack_ipv4
  89. lsmod | grep ip_vs
  90.  
  91. 2、安装etcd
  92.  
  93. etcd安装请参照: https://www.cnblogs.com/effortsing/p/10295261.html
  94.  
  95. 下面开始安装k8s组件,序号从6开始
  96.  
  97. 6、分发二进制组件
  98.  
  99. # 只在test1 节点上操作
  100.  
  101. # 提前分发k8s所有组件二进制文件、顺便安装kubectl工具
  102.  
  103. # 安装包解压后包括 kubectl 工具,所以不需要单独使用kubernetes-server-client-amd64.tar.gz 安装包分发 kubectl 工具
  104.  
  105. 下载、解压安装包
  106.  
  107. cd /server/software/k8s
  108.  
  109. 下载链接:https://pan.baidu.com/s/1DXahqP8nXWP1aw5pIunJrw
  110. 提取码:9xfp
  111.  
  112. tar -xf kubernetes-server-linux-amd64.tar.gz
  113.  
  114. 分发所有组件二进制文件,
  115.  
  116. # 后面配置 kube-apiserver 等各个组件启动文件里面需要带上各自二进制文件路径
  117.  
  118. mkdir -p /usr/local/kubernetes/bin
  119. cd /server/software/k8s/kubernetes/server/bin
  120. cp kube-apiserver kube-controller-manager kube-scheduler kubectl /usr/local/kubernetes/bin #这一步很关键
  121.  
  122. 安装kubectl工具
  123.  
  124. # 后面创建 admin kubeconfig等配置文件时候需要用到;
  125.  
  126. # admin.conf = ~/.kube/config,因为是复制过来的 ;
  127.  
  128. # kubectl作用:当kubelet组件通过bootstrap token 认证后,kubectl默认从 ~/.kube/config 文件读取 kube-apiserver 地址、证书、用户名等信息;
  129.  
  130. cp /usr/local/kubernetes/bin/kubectl /usr/local/bin/kubectl
  131.  
  132. 查看 kubectl 版本,
  133.  
  134. # 出现下面的情况就是正确的。did you specify the right host or port? 这个报错忽略,因为还没有安装kubelet服务
  135.  
  136. kubectl version
  137.  
  138. [root@test1 bin]# kubectl version
  139. Client Version: version.Info{Major:"", Minor:"", GitVersion:"v1.11.0", GitCommit:"91e7b4fd31fcd3d5f436da26c980becec37ceefe", GitTreeState:"clean", BuildDate:"2018-06-27T20:17:28Z", GoVersion:"go1.10.2", Compiler:"gc", Platform:"linux/amd64"}
  140. The connection to the server localhost:8080 was refused - did you specify the right host or port?
  141.  
  142. cd $HOME
  143.  
  144. 7、生成adminca证书和私钥
  145.  
  146. # 只在test1 节点上操作
  147.  
  148. # kubectl 作为集群的管理工具,需要被授予最高权限。这里创建具有最高权限的 admin 证书、admin kubeconfig
  149.  
  150. # 注意:后面只有apiserver和kubelet这两个服务启动参数会用到admin的ca证书;kubectl工具和kubelet服务不是一回事
  151.  
  152. cd $HOME/ssl
  153.  
  154. cat >admin-csr.json<<EOF
  155. {
  156. "CN": "admin",
  157. "key": {
  158. "algo": "rsa",
  159. "size": 2048
  160. },
  161. "names": [
  162. {
  163. "C": "CN",
  164. "ST": "BeiJing",
  165. "L": "BeiJing",
  166. "O": "system:masters",
  167. "OU": "System"
  168. }
  169. ]
  170. }
  171. EOF
  172.  
  173. 生成 admin ca
  174.  
  175. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json \
  176. -profile=kubernetes admin-csr.json | cfssljson -bare admin
  177.  
  178. 查看生成的admin ca
  179.  
  180. ls admin*.pem
  181.  
  182. 8、配置 kube-apiserver ca
  183.  
  184. # 只在 test1节点上操作
  185.  
  186. # 10.96.0.1 是 kube-apiserver 指定的 service-cluster-ip-range 网段的第一个IP
  187.  
  188. cd $HOME/ssl
  189.  
  190. cat >kube-apiserver-csr.json<<EOF
  191. {
  192. "CN": "kube-apiserver",
  193. "hosts": [
  194. "127.0.0.1",
  195. "192.168.0.91",
  196. "192.168.0.92",
  197. "192.168.0.93",
  198. "10.96.0.1",
  199. "kubernetes",
  200. "kubernetes.default",
  201. "kubernetes.default.svc",
  202. "kubernetes.default.svc.cluster",
  203. "kubernetes.default.svc.cluster.local"
  204. ],
  205. "key": {
  206. "algo": "rsa",
  207. "size": 2048
  208. },
  209. "names": [
  210. {
  211. "C": "CN",
  212. "ST": "BeiJing",
  213. "L": "BeiJing",
  214. "O": "k8s",
  215. "OU": "System"
  216. }
  217. ]
  218. }
  219. EOF
  220.  
  221. 生成 kube-apiserver ca
  222.  
  223. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json \
  224. -profile=kubernetes kube-apiserver-csr.json | cfssljson -bare kube-apiserver
  225.  
  226. 查看生成的kube-apiserver ca
  227.  
  228. ls kube-apiserver*.pem
  229.  
  230. 9、配置 kube-controller-manager ca
  231.  
  232. # 只在 test1节点上操作
  233.  
  234. cd $HOME/ssl
  235.  
  236. cat >kube-controller-manager-csr.json<<EOF
  237. {
  238. "CN": "system:kube-controller-manager",
  239. "hosts": [
  240. "127.0.0.1",
  241. "192.168.0.91"
  242. ],
  243. "key": {
  244. "algo": "rsa",
  245. "size": 2048
  246. },
  247. "names": [
  248. {
  249. "C": "CN",
  250. "ST": "BeiJing",
  251. "L": "BeiJing",
  252. "O": "system:kube-controller-manager",
  253. "OU": "System"
  254. }
  255. ]
  256. }
  257. EOF
  258.  
  259. 生成 kube-controller-manager ca
  260.  
  261. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json \
  262. -profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager
  263.  
  264. 查看生成的kube-controller-manager ca
  265.  
  266. ls kube-controller-manager*.pem
  267.  
  268. 10、配置 kube-scheduler ca
  269.  
  270. # 只在test1 节点上操作
  271.  
  272. cd $HOME/ssl
  273.  
  274. cat >kube-scheduler-csr.json<<EOF
  275. {
  276. "CN": "system:kube-scheduler",
  277. "hosts": [
  278. "127.0.0.1",
  279. "192.168.0.91"
  280. ],
  281. "key": {
  282. "algo": "rsa",
  283. "size": 2048
  284. },
  285. "names": [
  286. {
  287. "C": "CN",
  288. "ST": "BeiJing",
  289. "L": "BeiJing",
  290. "O": "system:kube-scheduler",
  291. "OU": "System"
  292. }
  293. ]
  294. }
  295. EOF
  296.  
  297. 生成 kube-scheduler ca
  298.  
  299. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json \
  300. -profile=kubernetes kube-scheduler-csr.json | cfssljson -bare kube-scheduler
  301.  
  302. 查看生成的kube-scheduler ca
  303.  
  304. ls kube-scheduler*.pem
  305.  
  306. 11、配置 kube-proxy ca
  307.  
  308. # 只在test1节点上操作
  309.  
  310. # 注意:只是node节点需要用到kube-proxy ca
  311.  
  312. cd $HOME/ssl
  313.  
  314. cat >kube-proxy-csr.json<<EOF
  315. {
  316. "CN": "system:kube-proxy",
  317. "key": {
  318. "algo": "rsa",
  319. "size": 2048
  320. },
  321. "names": [
  322. {
  323. "C": "CN",
  324. "ST": "BeiJing",
  325. "L": "BeiJing",
  326. "O": "system:kube-proxy",
  327. "OU": "System"
  328. }
  329. ]
  330. }
  331. EOF
  332.  
  333. 生成 kube-proxy ca
  334.  
  335. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json \
  336. -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
  337.  
  338. 查看生成的kube-proxy ca
  339.  
  340. ls kube-proxy*.pem
  341.  
  342. 12、复制所有的ca 证书到一个目录里面,方便管理
  343.  
  344. # 只在test1节点上操作
  345.  
  346. cd $HOME/ssl
  347. mkdir -p /etc/kubernetes/pki
  348. mkdir -p /etc/kubernetes/pki/etcd/
  349. cp ca*.pem admin*.pem kube-proxy*.pem kube-scheduler*.pem kube-controller-manager*.pem kube-apiserver*.pem /etc/kubernetes/pki
  350.  
  351. 13、开启 bootstrap token 认证 kubelet TLS Boostrap机制
  352.  
  353. # 只在test1 节点上操作
  354.  
  355. # kube-apiserver、kubelet启动文件需要用到token,
  356.  
  357. # token中包含kubelet-bootstrap用户
  358.  
  359. # 后面kubelet组件启动参数中需要使用 kubelet-bootstrap.conf 文件向 kube-apiserver 发送 CSR 请求,
  360.  
  361. # 请求通过后,kubectl才会从 ~/.kube/config 文件读取 kube-apiserver 地址、证书、用户名等信息
  362.  
  363. 静态获取token
  364.  
  365. # 还有一种是用 kubeadm 动态获取token,kubeadm token create,这样可以使用 TLS bootstrap 机制自动生成 client 和 server 证书,过期后自动轮转。
  366.  
  367. # 本实验采用静态获取,一天后过期
  368.  
  369. export BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
  370.  
  371. 创建token.csv文件
  372.  
  373. # 只有kube-apiserver 启动文件中需要用到
  374.  
  375. cat > /etc/kubernetes/token.csv <<EOF
  376. ${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
  377. EOF
  378.  
  379. 创建kubelet-bootstrap.conf
  380.  
  381. # 只有kubelet启动文件需要用到
  382.  
  383. cd /etc/kubernetes
  384.  
  385. export KUBE_APISERVER="https://192.168.0.91:6443"
  386.  
  387. kubectl config set-cluster kubernetes \
  388. --certificate-authority=/etc/kubernetes/pki/ca.pem \
  389. --embed-certs=true \
  390. --server=${KUBE_APISERVER} \
  391. --kubeconfig=kubelet-bootstrap.conf
  392.  
  393. kubectl config set-credentials kubelet-bootstrap \
  394. --token=${BOOTSTRAP_TOKEN} \
  395. --kubeconfig=kubelet-bootstrap.conf
  396.  
  397. kubectl config set-context default \
  398. --cluster=kubernetes \
  399. --user=kubelet-bootstrap \
  400. --kubeconfig=kubelet-bootstrap.conf
  401.  
  402. kubectl config use-context default --kubeconfig=kubelet-bootstrap.conf
  403.  
  404. 14、创建 admin kubeconfig
  405.  
  406. # 只在test1节点上操作
  407.  
  408. # 只有kubelet服务启动参数需要用到admin kubeconfig,
  409. # admin.conf = ~/.kube/config,因为复制过来的 ;kubectl 默认从 ~/.kube/config 文件读取 kube-apiserver 地址、证书、用户名等信息,
  410.  
  411. cd /etc/kubernetes
  412.  
  413. export KUBE_APISERVER="https://192.168.0.91:6443"
  414.  
  415. 设置集群参数
  416.  
  417. kubectl config set-cluster kubernetes \
  418. --certificate-authority=/etc/kubernetes/pki/ca.pem \
  419. --embed-certs=true \
  420. --server=${KUBE_APISERVER} \
  421. --kubeconfig=admin.conf
  422.  
  423. 设置客户端认证参数
  424.  
  425. kubectl config set-credentials admin \
  426. --client-certificate=/etc/kubernetes/pki/admin.pem \
  427. --client-key=/etc/kubernetes/pki/admin-key.pem \
  428. --embed-certs=true \
  429. --kubeconfig=admin.conf
  430.  
  431. 设置上下文参数
  432.  
  433. kubectl config set-context default \
  434. --cluster=kubernetes \
  435. --user=admin \
  436. --kubeconfig=admin.conf
  437.  
  438. 设置默认上下文
  439.  
  440. kubectl config use-context default --kubeconfig=admin.conf
  441.  
  442. 15、创建 kube-controller-manager kubeconfig
  443.  
  444. # 只在test1 节点上操作
  445.  
  446. cd /etc/kubernetes
  447.  
  448. export KUBE_APISERVER="https://192.168.0.91:6443"
  449.  
  450. kubectl config set-cluster kubernetes \
  451. --certificate-authority=/etc/kubernetes/pki/ca.pem \
  452. --embed-certs=true \
  453. --server=${KUBE_APISERVER} \
  454. --kubeconfig=kube-controller-manager.conf
  455.  
  456. kubectl config set-credentials kube-controller-manager \
  457. --client-certificate=/etc/kubernetes/pki/kube-controller-manager.pem \
  458. --client-key=/etc/kubernetes/pki/kube-controller-manager-key.pem \
  459. --embed-certs=true \
  460. --kubeconfig=kube-controller-manager.conf
  461.  
  462. kubectl config set-context default \
  463. --cluster=kubernetes \
  464. --user=kube-controller-manager \
  465. --kubeconfig=kube-controller-manager.conf
  466.  
  467. kubectl config use-context default --kubeconfig=kube-controller-manager.conf
  468.  
  469. 16、创建 kube-scheduler kubeconfig
  470.  
  471. # 只在test1 节点上操作
  472.  
  473. cd /etc/kubernetes
  474.  
  475. export KUBE_APISERVER="https://192.168.0.91:6443"
  476.  
  477. kubectl config set-cluster kubernetes \
  478. --certificate-authority=/etc/kubernetes/pki/ca.pem \
  479. --embed-certs=true \
  480. --server=${KUBE_APISERVER} \
  481. --kubeconfig=kube-scheduler.conf
  482.  
  483. kubectl config set-credentials kube-scheduler \
  484. --client-certificate=/etc/kubernetes/pki/kube-scheduler.pem \
  485. --client-key=/etc/kubernetes/pki/kube-scheduler-key.pem \
  486. --embed-certs=true \
  487. --kubeconfig=kube-scheduler.conf
  488.  
  489. kubectl config set-context default \
  490. --cluster=kubernetes \
  491. --user=kube-scheduler \
  492. --kubeconfig=kube-scheduler.conf
  493.  
  494. kubectl config use-context default --kubeconfig=kube-scheduler.conf
  495.  
  496. 17、创建 kube-proxy kubeconfig
  497.  
  498. # 只在test1 节点上操作
  499.  
  500. # 注意:只是node节点需要用到kube-proxy kubeconfig
  501.  
  502. cd /etc/kubernetes
  503.  
  504. export KUBE_APISERVER="https://192.168.0.91:6443"
  505.  
  506. kubectl config set-cluster kubernetes \
  507. --certificate-authority=/etc/kubernetes/pki/ca.pem \
  508. --embed-certs=true \
  509. --server=${KUBE_APISERVER} \
  510. --kubeconfig=kube-proxy.conf
  511.  
  512. kubectl config set-credentials kube-proxy \
  513. --client-certificate=/etc/kubernetes/pki/kube-proxy.pem \
  514. --client-key=/etc/kubernetes/pki/kube-proxy-key.pem \
  515. --embed-certs=true \
  516. --kubeconfig=kube-proxy.conf
  517.  
  518. kubectl config set-context default \
  519. --cluster=kubernetes \
  520. --user=kube-proxy \
  521. --kubeconfig=kube-proxy.conf
  522.  
  523. kubectl config use-context default --kubeconfig=kube-proxy.conf
  524.  
  525. cd $HOME
  526.  
  527. 18、配置启动kube-apiserver
  528.  
  529. # 只在test1 节点上操作
  530.  
  531. 复制 etcd ca
  532.  
  533. mkdir -pv /etc/kubernetes/pki/etcd
  534. cd $HOME/ssl
  535. cp etcd.pem etcd-key.pem ca-key.pem ca.pem /etc/kubernetes/pki/etcd
  536.  
  537. 生成 service account key
  538.  
  539. cd /etc/kubernetes/pki/
  540. openssl genrsa -out /etc/kubernetes/pki/sa.key 2048
  541. openssl rsa -in /etc/kubernetes/pki/sa.key -pubout -out /etc/kubernetes/pki/sa.pub
  542. ls /etc/kubernetes/pki/sa.*
  543. cd $HOME
  544.  
  545. 配置启动文件
  546.  
  547. cat >/etc/systemd/system/kube-apiserver.service<<EOF
  548. [Unit]
  549. Description=Kubernetes API Service
  550. Documentation=https://github.com/kubernetes/kubernetes
  551. After=network.target
  552.  
  553. [Service]
  554. EnvironmentFile=-/etc/kubernetes/config
  555. EnvironmentFile=-/etc/kubernetes/apiserver
  556. ExecStart=/usr/local/kubernetes/bin/kube-apiserver \\
  557. \$KUBE_LOGTOSTDERR \\
  558. \$KUBE_LOG_LEVEL \\
  559. \$KUBE_ETCD_ARGS \\
  560. \$KUBE_API_ADDRESS \\
  561. \$KUBE_SERVICE_ADDRESSES \\
  562. \$KUBE_ADMISSION_CONTROL \\
  563. \$KUBE_APISERVER_ARGS
  564. Restart=on-failure
  565. Type=notify
  566. LimitNOFILE=65536
  567.  
  568. [Install]
  569. WantedBy=multi-user.target
  570. EOF
  571.  
  572. 配置参数变量文件
  573.  
  574. # 下面 kube-apiserver、kube-controller-manager、kube-scheduler、kube-proxy这些服务 都需要用到,这里只配置一次,以后重复利用,后面的也写了变量文件,只是为了知道怎么回事
  575.  
  576. cat >/etc/kubernetes/config<<EOF
  577. KUBE_LOGTOSTDERR="--logtostderr=true"
  578. KUBE_LOG_LEVEL="--v=2"
  579. EOF
  580.  
  581. 配置apiserver
  582.  
  583. # 注意参数--token-auth-file=/etc/kubernetes/token.csv 表示在 apiserver 中静态配置bootstrap token,和后面开启 bootstrap token 认证步骤相呼应,不是动态的,所以有过期时间,
  584.  
  585. # 后面kubelet组件启动参数中需要使用 kubelet-bootstrap.conf 文件向 kube-apiserver 发送 CSR 请求,--bootstrap-kubeconfig 文件里面包含token和apiserver里面的token是一样的,
  586.  
  587. cat >/etc/kubernetes/apiserver<<EOF
  588. KUBE_API_ADDRESS="--advertise-address=192.168.0.91"
  589. KUBE_ETCD_ARGS="--etcd-servers=https://192.168.0.91:2379 --etcd-cafile=/etc/kubernetes/pki/ca.pem --etcd-certfile=/etc/kubernetes/pki/etcd/etcd.pem --etcd-keyfile=/etc/kubernetes/pki/etcd/etcd-key.pem"
  590. KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.96.0.0/12"
  591. KUBE_ADMISSION_CONTROL="--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
  592. KUBE_APISERVER_ARGS="--allow-privileged=true --authorization-mode=Node,RBAC --enable-bootstrap-token-auth=true --token-auth-file=/etc/kubernetes/token.csv --service-node-port-range=0-60000 --tls-cert-file=/etc/kubernetes/pki/kube-apiserver.pem --tls-private-key-file=/etc/kubernetes/pki/kube-apiserver-key.pem --client-ca-file=/etc/kubernetes/pki/ca.pem --service-account-key-file=/etc/kubernetes/pki/sa.pub --enable-swagger-ui=true --secure-port=6443 --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --anonymous-auth=false --kubelet-client-certificate=/etc/kubernetes/pki/admin.pem --kubelet-client-key=/etc/kubernetes/pki/admin-key.pem"
  593. EOF
  594.  
  595. 启动
  596.  
  597. systemctl daemon-reload
  598. systemctl enable kube-apiserver
  599. systemctl start kube-apiserver
  600. systemctl status kube-apiserver
  601.  
  602. 通过浏览器访问测试
  603.  
  604. # 401 报错正常,是因为没有权限,不影响,以后解决
  605.  
  606. curl https://192.168.0.91:6443/swaggerapi
  607.  
  608. [root@test1 ~]# curl https://192.168.0.91:6443/swaggerapi
  609. curl: (60) Peer's Certificate issuer is not recognized.
  610. More details here: http://curl.haxx.se/docs/sslcerts.html
  611.  
  612. curl performs SSL certificate verification by default, using a "bundle"
  613. of Certificate Authority (CA) public keys (CA certs). If the default
  614. bundle file isn't adequate, you can specify an alternate file
  615. using the --cacert option.
  616. If this HTTPS server uses a certificate signed by a CA represented in
  617. the bundle, the certificate verification probably failed due to a
  618. problem with the certificate (it might be expired, or the name might
  619. not match the domain name in the URL).
  620. If you'd like to turn off curl's verification of the certificate, use
  621. the -k (or --insecure) option.
  622.  
  623. 19、配置启动kube-controller-manager
  624.  
  625. # 只在test1 节点上操作
  626.  
  627. 配置启动文件
  628.  
  629. cat >/etc/systemd/system/kube-controller-manager.service<<EOF
  630. Description=Kubernetes Controller Manager
  631. Documentation=https://github.com/kubernetes/kubernetes
  632. After=network.target
  633.  
  634. [Service]
  635. EnvironmentFile=-/etc/kubernetes/config
  636. EnvironmentFile=-/etc/kubernetes/controller-manager
  637. ExecStart=/usr/local/kubernetes/bin/kube-controller-manager \\
  638. \$KUBE_LOGTOSTDERR \\
  639. \$KUBE_LOG_LEVEL \\
  640. \$KUBECONFIG \\
  641. \$KUBE_CONTROLLER_MANAGER_ARGS
  642. Restart=on-failure
  643. LimitNOFILE=65536
  644.  
  645. [Install]
  646. WantedBy=multi-user.target
  647. EOF
  648.  
  649. 配置参数变量文件
  650.  
  651. # 配置kube-apiserver启动文件时已经配置过参数变量文件,这里就不需要再做,写在这里只是为了知道下面配置文件里的参数怎么回事
  652.  
  653. cat >/etc/kubernetes/config<<EOF
  654. KUBE_LOGTOSTDERR="--logtostderr=true"
  655. KUBE_LOG_LEVEL="--v=2"
  656. EOF
  657.  
  658. 配置controller-manager文件
  659.  
  660. # 特别注意:这里的cluster-cidr地址要和 Kube-proxy里面的cluster-cidr、flannel 里面的Network 地址保持一致,这有这三个组件里面有 10.244.0.0
  661.  
  662. cat >/etc/kubernetes/controller-manager<<EOF
  663. KUBECONFIG="--kubeconfig=/etc/kubernetes/kube-controller-manager.conf"
  664. KUBE_CONTROLLER_MANAGER_ARGS="--address=127.0.0.1 --cluster-cidr=10.244.0.0/16 --cluster-name=kubernetes --cluster-signing-cert-file=/etc/kubernetes/pki/ca.pem --cluster-signing-key-file=/etc/kubernetes/pki/ca-key.pem --service-account-private-key-file=/etc/kubernetes/pki/sa.key --root-ca-file=/etc/kubernetes/pki/ca.pem --leader-elect=true --use-service-account-credentials=true --node-monitor-grace-period=10s --pod-eviction-timeout=10s --allocate-node-cidrs=true --controllers=*,bootstrapsigner,tokencleaner"
  665. EOF
  666.  
  667. 启动
  668. systemctl daemon-reload
  669. systemctl enable kube-controller-manager
  670. systemctl start kube-controller-manager
  671. systemctl status kube-controller-manager
  672.  
  673. 20、配置启动kube-scheduler
  674.  
  675. # 只在test1 节点上操作
  676.  
  677. 配置启动文件
  678.  
  679. cat >/etc/systemd/system/kube-scheduler.service<<EOF
  680. [Unit]
  681. Description=Kubernetes Scheduler Plugin
  682. Documentation=https://github.com/kubernetes/kubernetes
  683.  
  684. [Service]
  685. EnvironmentFile=-/etc/kubernetes/config
  686. EnvironmentFile=-/etc/kubernetes/scheduler
  687. ExecStart=/usr/local/kubernetes/bin/kube-scheduler \\
  688. \$KUBE_LOGTOSTDERR \\
  689. \$KUBE_LOG_LEVEL \\
  690. \$KUBECONFIG \\
  691. \$KUBE_SCHEDULER_ARGS
  692. Restart=on-failure
  693. LimitNOFILE=65536
  694.  
  695. [Install]
  696. WantedBy=multi-user.target
  697. EOF
  698.  
  699. 配置参数变量文件
  700.  
  701. # 配置kube-apiserver启动文件时已经配置过参数变量文件,这里就不需要再做,写在这里只是为了知道下面配置文件里的参数怎么回事
  702.  
  703. cat >/etc/kubernetes/config<<EOF
  704. KUBE_LOGTOSTDERR="--logtostderr=true"
  705. KUBE_LOG_LEVEL="--v=2"
  706. EOF
  707.  
  708. 配置scheduler文件
  709.  
  710. cat >/etc/kubernetes/scheduler<<EOF
  711. KUBECONFIG="--kubeconfig=/etc/kubernetes/kube-scheduler.conf"
  712. KUBE_SCHEDULER_ARGS="--leader-elect=true --address=127.0.0.1"
  713. EOF
  714.  
  715. 启动
  716.  
  717. systemctl daemon-reload
  718. systemctl enable kube-scheduler
  719. systemctl start kube-scheduler
  720. systemctl status kube-scheduler
  721.  
  722. kubelet-bootstrap用户授权
  723.  
  724. # 创建一个 clusterrolebinding,将 bootstrap token 文件中的 kubelet-bootstrap 用户赋予 system:node-bootstrapper cluster 角色
  725.  
  726. # 默认情况下,bootstrap这个 user 和 group 没有创建 CSR 的权限,kubelet 会启动失败,所以要给kubelet-bootstrap角色授权
  727.  
  728. kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
  729.  
  730. # 如果没有授权会出现下面错误:
  731.  
  732. [root@test2 kubernetes]# journalctl -u kubelet |tail
  733. failed to run Kubelet: cannot create certificate signing request: certificatesigningrequests.certificates.k8s.io is forbidden: User "kubelet-bootstrap" cannot create certificatesigningrequests.certificates.k8s.io at the cluster scope
  734.  
  735. 查看组件状态
  736.  
  737. kubectl get componentstatuses
  738.  
  739. [root@test2 ~]# kubectl get componentstatuses
  740. Unable to connect to the server: x509: certificate signed by unknown authority
  741. # 报错原因:经过排查后发现前面操作的几个步骤中 ${KUBE_APISERVER} 这个变量写成了 ${KUBE_ 又重做了一遍,正确的结果是下面
  742.  
  743. [root@test2 ~]# kubectl get componentstatuses
  744. NAME STATUS MESSAGE ERROR
  745. scheduler Healthy ok
  746. controller-manager Healthy ok
  747. etcd-0 Healthy {"health": "true"}
  748.  
  749. # test1 节点安装到此结束,下面开始单独安装node节点
  750.  
  751. 21、单独配置node 相关组件
  752.  
  753. 环境配置
  754.  
  755. # 如下操作在所有节点操作
  756.  
  757. 修改主机名
  758.  
  759. # 注意修改 各自节点对应的 主机名
  760.  
  761. sed -i '$a\hostname=test2' /etc/hostname
  762. sed -i '$a\hostname=test2' /etc/sysconfig/network && hostnamectl set-hostname test2
  763.  
  764. 配置hosts解析
  765.  
  766. cat >>/etc/hosts<<EOF
  767. 192.168.0.91 test1
  768. 192.168.0.92 test2
  769. 192.168.0.93 test3
  770. EOF
  771.  
  772. 禁用selinux
  773.  
  774. sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
  775.  
  776. sed -i 's/enforcing/disabled/g' /etc/selinux/config
  777.  
  778. 永久关闭swap
  779.  
  780. # 注释/etc/fstab文件里swap相关的行,需要重启
  781.  
  782. sed -i 's/\/dev\/mapper\/centos-swap/#\/dev\/mapper\/centos-swap/g' /etc/fstab
  783.  
  784. 临时关闭swap
  785.  
  786. swapoff -a
  787.  
  788. 关掉防火墙
  789.  
  790. systemctl stop firewalld && systemctl disable firewalld
  791.  
  792. 重启
  793.  
  794. reboot
  795.  
  796. 开启forward
  797.  
  798. iptables -P FORWARD ACCEPT
  799.  
  800. 配置转发相关参数
  801.  
  802. cat >> /etc/sysctl.d/k8s.conf <<EOF
  803. net.bridge.bridge-nf-call-ip6tables = 1
  804. net.bridge.bridge-nf-call-iptables = 1
  805. vm.swappiness=0
  806. EOF
  807.  
  808. 加载系统参数
  809.  
  810. sysctl --system
  811.  
  812. 加载ipvs相关内核模块
  813.  
  814. # 如果重新开机,需要重新加载
  815.  
  816. modprobe ip_vs
  817. modprobe ip_vs_rr
  818. modprobe ip_vs_wrr
  819. modprobe ip_vs_sh
  820. modprobe nf_conntrack_ipv4
  821. lsmod | grep ip_vs
  822.  
  823. 21.1、安装docker
  824.  
  825. # 只在 test2 节点上操作
  826.  
  827. # 注意:docker和flannel是一体的,哪个节点上需要安装flannel,哪个节点上就需要安装docker
  828.  
  829. # docker 和kubelet组件、node状态有关系, 之前停掉docker后,kubelet组件会自动停掉;node节点会变成 NotReady 状态
  830.  
  831. # 但是停掉docker后,flanel、coredns 的pod 让然是 running 状态
  832.  
  833. # v1.11.0版本推荐使用docker v17.03, v1.11,v1.12,v1.13, 也可以使用,再高版本的docker可能无法正常使用。测试发现17.09无法正常使用,不能使用资源限制(内存CPU)
  834.  
  835. 卸载自带docker
  836.  
  837. yum remove -y docker-ce docker-ce-selinux container-selinux
  838.  
  839. 下载Docker镜像
  840.  
  841. 下载链接:https://pan.baidu.com/s/1whfkq5wDODIew5_eqP63gA
  842. 提取码:xmqq
  843.  
  844. 下载链接:https://pan.baidu.com/s/1zZy_tbvuApZW2fsMPGv3Bg
  845. 提取码:u3t3
  846.  
  847. 添加至镜像仓库
  848.  
  849. rpm -ivh docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm
  850. rpm -ivh docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm
  851.  
  852. 用安装 Docker 和依赖包
  853.  
  854. yum install -y docker-ce-*.rpm
  855.  
  856. 开机启动
  857.  
  858. systemctl enable docker
  859.  
  860. 启动 docker 服务
  861.  
  862. systemctl start docker
  863.  
  864. 21.2、部署 kubelet组件
  865.  
  866. # 只在test2 节点上操作
  867.  
  868. # kubelet的作用:向 test1 发起csr请求。
  869.  
  870. # 初次安装完 kubelet,只要第一次启动kubelet,通过kubelet get csr 就会得到这串字符串:node-csr-Yiiv675wUCvQl3HH11jDr0cC9p3kbrXWrxvG3EjWGoE
  871.  
  872. 下载、解压安装包
  873. mkdir -p /server/software/k8s
  874. cd /server/software/k8s
  875. 下载链接:https://pan.baidu.com/s/1DXahqP8nXWP1aw5pIunJrw
  876. 提取码:9xfp
  877. tar -xf kubernetes-server-linux-amd64.tar.gz
  878.  
  879. 分发kubelet二进制文件
  880.  
  881. # 后面kubelet启动文件需要用到kubelet二进制文件路径
  882.  
  883. mkdir -p /usr/local/kubernetes/bin
  884. cp /server/software/k8s/kubernetes/server/bin/kubelet /usr/local/kubernetes/bin #这一步很关键
  885.  
  886. 安装kubectl工具
  887.  
  888. # kubecctl工具和kubelet服务不是一回事。安装包解压后包括 kubectl 工具,所以不需要单独使用kubernetes-server-client-amd64.tar.gz 安装包分发 kubectl 工具
  889.  
  890. # kubectl作用:当kubelet组件通过bootstrap token 认证后,kubectl 默认会从 ~/.kube/config 文件读取 kube-apiserver 地址、证书、用户名等信息;
  891.  
  892. # admin.conf = ~/.kube/config,因为复制过来的 ;
  893.  
  894. cp /server/software/k8s/kubernetes/server/bin/kubectl /usr/local/bin/kubectl
  895.  
  896. 查看 kubectl 版本,
  897.  
  898. # 出现下面的情况就是正确的。did you specify the right host or port? 这个报错忽略,因为还没有安装kubelet服务
  899.  
  900. kubectl version
  901.  
  902. [root@test1 bin]# kubectl version
  903. Client Version: version.Info{Major:"", Minor:"", GitVersion:"v1.11.0", GitCommit:"91e7b4fd31fcd3d5f436da26c980becec37ceefe", GitTreeState:"clean", BuildDate:"2018-06-27T20:17:28Z", GoVersion:"go1.10.2", Compiler:"gc", Platform:"linux/amd64"}
  904. The connection to the server localhost:8080 was refused - did you specify the right host or port?
  905.  
  906. cd $HOME
  907.  
  908. 拷贝admin.conf
  909.  
  910. # 从test1上复制admin.conf到test2节点
  911.  
  912. test2上创建目录
  913.  
  914. mkdir -p /etc/kubernetes/
  915.  
  916. test2上复制
  917.  
  918. scp /etc/kubernetes/admin.conf root@192.168.0.92:/etc/kubernetes/
  919.  
  920. 配置 /.kube/config 并且授权
  921.  
  922. # kubectl 默认从 ~/.kube/config 文件读取 kube-apiserver 地址、证书、用户名等信息,如果没有配置,执行 kubectl 命令时可能会出错:
  923. # /.kube/config 和 admin.conf 内容是一样的,/.kube/config 是 admin.conf 复制过来的,改了下名字而已
  924.  
  925. rm -rf $HOME/.kube
  926. mkdir -p $HOME/.kube
  927. cp /etc/kubernetes/admin.conf $HOME/.kube/config
  928. chown $(id -u):$(id -g) $HOME/.kube/config
  929.  
  930. 拷贝bootstrap.conf
  931.  
  932. #从test1 上复制 bootstrap.conf 到test2 节点
  933.  
  934. # 后面kubelet服务启动参数中需要使用 kubelet-bootstrap.conf 向 kube-apiserver 发送 CSR 请求,
  935.  
  936. # 当kubelet服务通过bootstrap token 认证后,kubectl 默认会从 ~/.kube/config 文件读取 kube-apiserver 地址、证书、用户名等信息;
  937.  
  938. scp /etc/kubernetes/kubelet-bootstrap.conf root@192.168.0.92:/etc/kubernetes/
  939.  
  940. 安装cni
  941.  
  942. # kubelet 的启动参数需要用到
  943.  
  944. cd /server/software/k8s
  945.  
  946. 下载链接:https://pan.baidu.com/s/1DL1v4cH2SHUfobICjKXm3Q
  947. 提取码:puel
  948. mkdir -p /opt/cni/bin
  949. mkdir -p /etc/cni/net.d/
  950. tar -xf cni-plugins-amd64-v0.7.1.tgz -C /opt/cni/bin
  951. ls -l /opt/cni/bin
  952.  
  953. cd $HOME
  954.  
  955. 配置启动kubelet
  956.  
  957. 创建数据目录
  958.  
  959. mkdir -p /data/kubelet
  960.  
  961. 配置kubelet启动文件
  962.  
  963. cat >/etc/systemd/system/kubelet.service<<EOF
  964. [Unit]
  965. Description=Kubernetes Kubelet Server
  966. Documentation=https://github.com/kubernetes/kubernetes
  967. After=docker.service
  968. Requires=docker.service
  969.  
  970. [Service]
  971. WorkingDirectory=/data/kubelet
  972. EnvironmentFile=-/etc/kubernetes/config
  973. EnvironmentFile=-/etc/kubernetes/kubelet
  974. ExecStart=/usr/local/kubernetes/bin/kubelet \\
  975. \$KUBE_LOGTOSTDERR \\
  976. \$KUBE_LOG_LEVEL \\
  977. \$KUBELET_CONFIG \\
  978. \$KUBELET_HOSTNAME \\
  979. \$KUBELET_POD_INFRA_CONTAINER \\
  980. \$KUBELET_ARGS \
  981. \$CADVISOR
  982. Restart=on-failure
  983.  
  984. [Install]
  985. WantedBy=multi-user.target
  986. EOF
  987.  
  988. 配置参数变量文件
  989.  
  990. cat >/etc/kubernetes/config<<EOF
  991. KUBE_LOGTOSTDERR="--logtostderr=true"
  992. KUBE_LOG_LEVEL="--v=2"
  993. EOF
  994.  
  995. 配置kubelet文件
  996.  
  997. # 注意修改kubelet文件里面的 --hostname-override= 要填写test1、test2、test3 这三个节点改成对应各自 ip ,或者各自的主机名。本实验写的主机名
  998.  
  999. # 如果--hostname-override= 填写的是ip,那么kubectl get nodes 得到的name就显示ip,如果填写的是主机名,得到的name就显示主机名
  1000.  
  1001. # image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1 这个镜像跟 kubectl get componentstatuses 获取不到资源没有关系,跟docker也没有关系
  1002.  
  1003. # 但是网上搜这个镜像,说这个镜像是基础镜像,目前被墙,最好下载放到本地 registry 上
  1004.  
  1005. # 注意 kubelet配置文件里面的参数kubelet.conf 是kubelet启动后生成的,不用管,就是这样写的
  1006.  
  1007. # 注意 /etc/kubernetes/pki 目录里面只放一个ca.pem 证书,
  1008.  
  1009. # 启动kubelet后/etc/kubernetes/pki 目录里面会自动生成四个文件 kubelet.crt、kubelet.key、kubelet-client-current.pem、kubelet-client-2019-01-22-10-07-06.pem
  1010.  
  1011. # CADVISOR 表明开启cadvisor监控,然后在启动文件中加上 ExecStart=$CADVISOR 就可以通过浏览器访问cadvisor监控,否则是无法访问的,
  1012.  
  1013. cat >/etc/kubernetes/kubelet<<EOF
  1014. KUBELET_HOSTNAME="--hostname-override=test2"
  1015. KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1"
  1016. CADVISOR="--cadvisor-port=4194 --storage-driver-db='cadvisor' --storage-driver-host='localhost:8086'"
  1017. KUBELET_CONFIG="--config=/etc/kubernetes/kubelet-config.yml"KUBELET_ARGS="--bootstrap-kubeconfig=/etc/kubernetes/kubelet-bootstrap.conf --kubeconfig=/etc/kubernetes/kubelet.conf --cert-dir=/etc/kubernetes/pki --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d/"
  1018. EOF
  1019.  
  1020. 拷贝ca.pem 证书
  1021.  
  1022. # 从test1 节点复制复制ca.pem 证书到test2 节点,下面kubelet-config.yml 文件参数需要用到 ca.pem
  1023.  
  1024. tes2上创建目录
  1025.  
  1026. mkdir -p /etc/kubernetes/pki
  1027.  
  1028. test1上复制文件
  1029.  
  1030. scp $HOME/ssl/ca.pem 192.168.0.92:/etc/kubernetes/pki/
  1031.  
  1032. 配置kubelet-config.yml文件
  1033.  
  1034. # 注意修改kubelet-config.yml相关ip,test1 test2 test3 使用各自ip
  1035.  
  1036. # 注意下面kubelet-config.yml里面的clusterDNS 地址要和coredns.yaml 里面的 clusterIP 地址保持一致。只有kubelet、coredns里面有 10.96.0.10,其他的组件都没有
  1037.  
  1038. cat >/etc/kubernetes/kubelet-config.yml<<EOF
  1039. kind: KubeletConfiguration
  1040. apiVersion: kubelet.config.k8s.io/v1beta1
  1041. address: 192.168.0.92
  1042. port: 10250
  1043. cgroupDriver: cgroupfs
  1044. clusterDNS:
  1045. - 10.96.0.10
  1046. clusterDomain: cluster.local.
  1047. hairpinMode: promiscuous-bridge
  1048. serializeImagePulls: false
  1049. authentication:
  1050. x509:
  1051. clientCAFile: /etc/kubernetes/pki/ca.pem
  1052. EOF
  1053.  
  1054. 启动
  1055. systemctl daemon-reload
  1056. systemctl enable kubelet
  1057. systemctl start kubelet # 启动后就会生成csr
  1058. systemctl status kubelet
  1059.  
  1060. 查看日志
  1061.  
  1062. # 启动 kubelet后查看日志会有报错
  1063.  
  1064. # 报错原因是因为kubelet配置了network-plugin=cni,但是还没安装网络插件 flannel,所以状态会是NotReady,会报上面的错误,不想看这个报错或者不需要网络,就修改kubelet配置文件,去掉network-plugin=cni 就可以了
  1065.  
  1066. [root@test2 ~]# journalctl -u kubelet |tail
  1067. network plugin is not ready: cni config uninitialized
  1068.  
  1069. 21.3、通过csr请求
  1070.  
  1071. # 在 test2 节点上操作就可以
  1072.  
  1073. # 通过csr请求的目的就是要生成一个nodes 节点
  1074.  
  1075. # 注意:node-csr-Yiiv675wUCvQl3HH11jDr0cC9p3kbrXWrxvG3EjWGoE 这个长字符串是kubelet 初次启动后生成的,
  1076.  
  1077. # 查看csr
  1078.  
  1079. # 如果获取不到csr看日志会出现下面错误:
  1080.  
  1081. [root@test2 kubernetes]# journalctl -u kubelet |tail
  1082. failed to run Kubelet: cannot create certificate signing request: certificatesigningrequests.certificates.k8s.io is forbidden: User "kubelet-bootstrap" cannot create certificatesigningrequests.certificates.k8s.io at the cluster scope
  1083.  
  1084. # 原因是因为没有给kubelet-bootstrap授权,授权即可
  1085.  
  1086. kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
  1087.  
  1088. kubectl get csr
  1089.  
  1090. 执行结果
  1091.  
  1092. [root@test2 ~]# kubectl get csr
  1093. NAME AGE REQUESTOR CONDITION
  1094. node-csr-Yiiv675wUCvQl3HH11jDr0cC9p3kbrXWrxvG3EjWGoE 18s kubelet-bootstrap Pending
  1095. You have new mail in /var/spool/mail/root
  1096.  
  1097. 通过csr请求,下面的长字符串填写上一步的结果,
  1098.  
  1099. kubectl certificate approve node-csr-Yiiv675wUCvQl3HH11jDr0cC9p3kbrXWrxvG3EjWGoE
  1100.  
  1101. 执行结果:
  1102.  
  1103. [root@test2 ~]# kubectl certificate approve node-csr-Yiiv675wUCvQl3HH11jDr0cC9p3kbrXWrxvG3EjWGoE
  1104. certificatesigningrequest.certificates.k8s.io/node-csr-Yiiv675wUCvQl3HH11jDr0cC9p3kbrXWrxvG3EjWGoE approved
  1105.  
  1106. 查看kubelet启动后生成的文件
  1107.  
  1108. 说明:kubelet 启动后使用 --bootstrap-kubeconfig kube-apiserver 发送 CSR 请求,当这个 CSR approve 后,kube-controller-manager kubelet 创建 TLS 客户端证书、私钥和 --kubeletconfig 文件。
  1109.  
  1110. kubelet.conf文件决定了csr的存在,如果要想重新获取csr,可以停掉kubelet,删除kubelet.conf文件,重启kubelet就可以获得csr
  1111.  
  1112. ls -l /etc/kubernetes/kubelet.conf
  1113. ls -l /etc/kubernetes/pki/kubelet*
  1114.  
  1115. 查看结果
  1116.  
  1117. [root@test2 ~]# ls -l /etc/kubernetes/kubelet.conf
  1118. -rw------- 1 root root 2295 Jan 22 10:07 /etc/kubernetes/kubelet.conf
  1119.  
  1120. [root@test2 ~]# ls -l /etc/kubernetes/pki/kubelet*
  1121. -rw------- 1 root root 1273 Jan 22 10:07 /etc/kubernetes/pki/kubelet-client-2019-01-22-10-07-06.pem
  1122. lrwxrwxrwx 1 root root 58 Jan 22 10:07 /etc/kubernetes/pki/kubelet-client-current.pem -> /etc/kubernetes/pki/kubelet-client-2019-01-22-10-07-06.pem
  1123. -rw-r--r-- 1 root root 2181 Jan 22 02:10 /etc/kubernetes/pki/kubelet.crt
  1124. -rw------- 1 root root 1675 Jan 22 02:10 /etc/kubernetes/pki/kubelet.key
  1125.  
  1126. 查看节点
  1127.  
  1128. # 此时节点状态为 NotReady,需要安装flannel网络后才可以ready;
  1129.  
  1130. # 但是此时就可以设置集群角色
  1131.  
  1132. # 此时查看只有一个node节点是因为test1 上并没有安装 kubelet 组件,只要 test1 安装上kubelet并且启动成功,就会生成csr,通过csr后,就会成为node节点
  1133.  
  1134. # 如果 test1 上也安装了kubelet,就可以把 test1 节点设置为master,因为 test1 节点上面安装了 kube-apiserver、 kube-controller-manager、kube-scheduler
  1135.  
  1136. # tes2 节点必须是node 节点,因为它没有安装 kube-apiserver、 kube-controller-manager、kube-scheduler 这几个组件
  1137.  
  1138. kubectl get nodes
  1139.  
  1140. [root@test2 ~]# kubectl get nodes
  1141. NAME STATUS ROLES AGE VERSION
  1142. test2 NotReady <none> 9h v1.11.0
  1143.  
  1144. 设置集群角色
  1145.  
  1146. # 在test2 节点上操作就可以
  1147.  
  1148. # 设置 test2 为 node 角色
  1149.  
  1150. kubectl label nodes test2 node-role.kubernetes.io/node=
  1151.  
  1152. [root@test2 ~]# kubectl label nodes test2 node-role.kubernetes.io/node=
  1153. node/test2 labeled
  1154.  
  1155. 再次查看节点
  1156.  
  1157. [root@test2 ~]# kubectl get nodes
  1158. NAME STATUS ROLES AGE VERSION
  1159. test2 NotReady node 2m v1.11.0
  1160.  
  1161. 21.4、配置启动kube-proxy
  1162.  
  1163. # 只在 test2 节点上操作
  1164.  
  1165. # 注意:关掉 kube-proxy 后仍然可以访问 svc curl "10.103.38.143:80" ,kube-proxy 的作用目前还没有发现
  1166.  
  1167. 下载、解压安装包(省略)
  1168.  
  1169. cd /server/software/k8s
  1170.  
  1171. 下载链接:https://pan.baidu.com/s/1DXahqP8nXWP1aw5pIunJrw
  1172. 提取码:9xfp
  1173.  
  1174. tar -xf kubernetes-server-linux-amd64.tar.gz
  1175.  
  1176. 分发kube-proxy二进制文件
  1177.  
  1178. # 后面kube-proxy.service启动文件需要用到kube-proxy二进制文件路径
  1179.  
  1180. mkdir -p /usr/local/kubernetes/bin
  1181. cp /server/software/k8s/kubernetes/server/bin/kube-proxy /usr/local/kubernetes/bin #这一步很关键
  1182.  
  1183. 安装依赖包
  1184.  
  1185. yum install -y conntrack-tools
  1186.  
  1187. 拷贝kube-proxy.conf文件
  1188.  
  1189. test1 节点上的kube-proxy.conf复制到/etc/kubernetes/ 目录下,kube-proxy.service启动参数中proxy文件需要用到kube-proxy.conf
  1190.  
  1191. scp /etc/kubernetes/kube-proxy.conf 192.168.0.92:/etc/kubernetes/
  1192.  
  1193. 配置启动文件
  1194.  
  1195. cat >/etc/systemd/system/kube-proxy.service<<EOF
  1196. [Unit]
  1197. Description=Kubernetes Kube-Proxy Server
  1198. Documentation=https://github.com/kubernetes/kubernetes
  1199. After=network.target
  1200.  
  1201. [Service]
  1202. EnvironmentFile=-/etc/kubernetes/config
  1203. EnvironmentFile=-/etc/kubernetes/proxy
  1204. ExecStart=/usr/local/kubernetes/bin/kube-proxy \\
  1205. \$KUBE_LOGTOSTDERR \\
  1206. \$KUBE_LOG_LEVEL \\
  1207. \$KUBECONFIG \\
  1208. \$KUBE_PROXY_ARGS
  1209. Restart=on-failure
  1210. LimitNOFILE=65536
  1211.  
  1212. [Install]
  1213. WantedBy=multi-user.target
  1214. EOF
  1215.  
  1216. 配置参数变量文件
  1217.  
  1218. # 前面配置kubelet组件时已经配置过参数变量文件,这里就不需要配置,写在这里这是知道是怎么回事
  1219.  
  1220. cat >/etc/kubernetes/config<<EOF
  1221. KUBE_LOGTOSTDERR="--logtostderr=true"
  1222. KUBE_LOG_LEVEL="--v=2"
  1223. EOF
  1224.  
  1225. 配置proxy文件
  1226.  
  1227. # 注意修改相关ip,test1 test2 test3 使用各自ip
  1228.  
  1229. # 看下面proxy文件'--proxy-mode=iptables',由于采用iptables模式,因为 ipvs 模式在centos7上有bug无法正常使用,1.11.0 以后的版本就可使用 ipvs 模式了,
  1230.  
  1231. # 本实验采用centos7.5、kubernetes 1.11.0 版本,所以使用iptables模式,
  1232.  
  1233. # 特别注意:下面的cluster-cidr地址要和controller-manager里面的cluster-cidr、flannel 里面的Network 地址保持一致,这有这三个组件里面有 10.244.0.0
  1234.  
  1235. cat >/etc/kubernetes/proxy<<EOF
  1236. KUBECONFIG="--kubeconfig=/etc/kubernetes/kube-proxy.conf"
  1237. KUBE_PROXY_ARGS="--bind-address=192.168.0.92 --proxy-mode=iptables --hostname-override=192.168.0.92 --cluster-cidr=10.244.0.0/16"
  1238. EOF
  1239.  
  1240. 启动
  1241. systemctl daemon-reload
  1242. systemctl enable kube-proxy
  1243. systemctl start kube-proxy
  1244. systemctl status kube-proxy
  1245.  
  1246. 21.5、安装flannel网络
  1247.  
  1248. # 只在test2 节点上操作
  1249.  
  1250. # flannel 作用之一: 让 node节点从 NotReady状态变为ready状态
  1251.  
  1252. # 注意: flanel 只需要安装一次,不需要再往 test1 节点或者test2 节点上安装 flanel
  1253.  
  1254. # 只有在安装了docker的节点上才可以安装flannel
  1255.  
  1256. # 注意下面的网卡名称要填写对应的网卡名称
  1257.  
  1258. 下载配置文件
  1259.  
  1260. mkdir flannel && cd flannel
  1261.  
  1262. 下载链接:https://pan.baidu.com/s/1kdrYzXYzURTzO_tXtv_R1A
  1263. 提取码:3kgd
  1264.  
  1265. 查看下载的文件
  1266.  
  1267. [root@test2 flannel]# ls
  1268. kube-flannel.yml
  1269.  
  1270. 修改ip地址:
  1271.  
  1272. # flannel网络 分三种网络 node network、service network、flannel network
  1273.  
  1274. # node network:承载kubernetes集群中各个“物理”Node(master和node)通信的网络
  1275.  
  1276. # 下面Network 就是 node network,因为当前还没有安装 flannel,test2 节点为 NotReady 状态;安装完 flannel后就是ready状态,
  1277.  
  1278. # 特别注意:下面的Network 地址要和controller-manager里面的cluster-cidr、kube-proxy里面的 cluster-cidr地址保持一致,这有这三个组件里面有 10.244.0.0
  1279.  
  1280. [root@test2 flannel]# vi kube-flannel.yml
  1281.  
  1282. net-conf.json: |
  1283. {
  1284. "Network": "10.244.0.0/16",
  1285. "Backend": {
  1286. "Type": "vxlan"
  1287. }
  1288. }
  1289.  
  1290. 修改镜像
  1291.  
  1292. # 由于自带的镜像被墙,无法下载,所以修改镜像为国内源 image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64
  1293.  
  1294. # 注意 kube-flannel.yml 文件里面有两个 镜像都需要改
  1295.  
  1296. [root@test2 flannel]# vi kube-flannel.yml
  1297. containers:
  1298. - name: kube-flannel
  1299. image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64
  1300. command:
  1301. - /opt/bin/flanneld
  1302. args:
  1303. - --ip-masq
  1304. - --kube-subnet-mgr
  1305. - --iface=ens33
  1306.  
  1307. 添加网卡参数
  1308.  
  1309. # 注意 - --iface=ens33 这个ens33 是 192.168.0.92 这台虚拟机的网卡信息
  1310.  
  1311. # 如果Node有多个网卡的话,参考flannel issues 39701,https://github.com/kubernetes/kubernetes/issues/39701
  1312.  
  1313. # 目前需要在kube-flannel.yml中使用--iface参数指定集群主机内网网卡的名称,否则可能会出现dns无法解析。容器无法通信的情况,
  1314.  
  1315. # flanneld启动参数加上--iface=<iface-name>
  1316.  
  1317. [root@test2 flannel]# vi kube-flannel.yml
  1318. containers:
  1319. - name: kube-flannel
  1320. image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64
  1321. command:
  1322. - /opt/bin/flanneld
  1323. args:
  1324. - --ip-masq
  1325. - --kube-subnet-mgr
  1326. - --iface=ens33
  1327.  
  1328. 启动flanel
  1329.  
  1330. kubectl apply -f kube-flannel.yml
  1331.  
  1332. 查看pod
  1333.  
  1334. # 如果flanel启动失败,很有可能镜像拉取失败,所以最好还是自建一个镜像仓库。有点慢等一会
  1335.  
  1336. kubectl get pods -n kube-system
  1337. kubectl get svc
  1338.  
  1339. [root@test2 flannel]# kubectl get pods -n kube-system
  1340. NAME READY STATUS RESTARTS AGE
  1341. kube-flannel-ds-zb2r2 1/1 Running 0 18s
  1342.  
  1343. [root@test2 flannel]# kubectl get svc
  1344. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  1345. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 22h
  1346.  
  1347. 查看节点状态
  1348.  
  1349. # 当 flannel pod 全部启动之后,节点状态才为 Ready
  1350.  
  1351. kubectl get no
  1352.  
  1353. [root@test2 flannel]# kubectl get no
  1354. NAME STATUS ROLES AGE VERSION
  1355. test2 Ready node 11h v1.11.0
  1356.  
  1357. 21.6、安装coredns
  1358.  
  1359. # 只在 test2 节点上操作
  1360.  
  1361. # coredns的作用:是实现pod里面的DNS解析,就是可以通过svc(service)来访问服务,例如:curl nginx-service ,curl + svc
  1362.  
  1363. # 注意:coredns 只安装一次就可以,不需要再往master角色或 其他node角色上安装
  1364.  
  1365. # 注意下面用的 coredns 1.2.0 版本
  1366.  
  1367. 安装jq工具
  1368.  
  1369. # 之前安装coredns报错找不到jq, 所以配置jq 源,然后用yum安装,安装jq 参照:https://www.cnblogs.com/effortsing/p/10307424.html
  1370.  
  1371. yum install jq -y
  1372.  
  1373. 下载coredns安装文件
  1374.  
  1375. cd $HOME && mkdir coredns && cd coredns
  1376.  
  1377. 下载链接:https://pan.baidu.com/s/1z7x4z2k2w3rdhOt89FDPww
  1378. 提取码:7vkf
  1379.  
  1380. 查看下载的文件
  1381.  
  1382. [root@test2 coredns]# ls
  1383. coredns.yaml
  1384.  
  1385. 修改配置文件
  1386.  
  1387. # 把文件里面的ip地址修改为10.96.0.10,
  1388.  
  1389. # 注意:下面coredns.yaml里面的clusterIP 地址要和 kubelet组件中kubelet-config.yml 配置文件里面的 clusterDNS 地址保持一致。只有kubelet、coredns里面有 10.96.0.10
  1390.  
  1391. [root@test2 coredns]# vi coredns.yaml
  1392. spec:
  1393. selector:
  1394. k8s-app: kube-dns
  1395. clusterIP: 10.96.0.10
  1396. ports:
  1397.  
  1398. 启动coredns
  1399.  
  1400. kubectl apply -f coredns.yaml
  1401.  
  1402. 查看coredns
  1403.  
  1404. # 过几分钟才会running ,有点慢
  1405.  
  1406. kubectl get pods -n kube-system
  1407. kubectl get svc -n kube-system
  1408.  
  1409. [root@test2 coredns]# kubectl get pods -n kube-system
  1410. NAME READY STATUS RESTARTS AGE
  1411. coredns-6c65fc5cbb-8ntpv 1/1 Running 0 34m
  1412. coredns-6c65fc5cbb-sj65c 1/1 Running 0 34m
  1413. kube-flannel-ds-zb2r2 1/1 Running 0 2h
  1414.  
  1415. [root@test2 coredns]# kubectl get svc -n kube-system
  1416. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  1417. kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 34m
  1418.  
  1419. 测试coredns功能
  1420.  
  1421. # 启动一个nginx容器,然后进行访问nginx服务进行测试看是否能访问
  1422.  
  1423. 下载nginx.yaml文件
  1424.  
  1425. 下载链接:https://pan.baidu.com/s/1PV8jyDhb8yBy6uyaeMMpSQ
  1426. 提取码:xt5f
  1427.  
  1428. 查看下载的文件
  1429.  
  1430. [root@test2 ~]# ls
  1431. nginx.yaml
  1432.  
  1433. 配置nginx镜像
  1434.  
  1435. # 用docker 找一个简单的nginx镜像,替换 nginx.yaml 里面的镜像,因为nginx.yaml里面的镜像都已经过时,无法下载
  1436.  
  1437. docker search nginx
  1438.  
  1439. [root@test2 ~]# docker search nginx
  1440. nginxdemos/hello NGINX webserver that serves a simple page ... 9 [OK]
  1441.  
  1442. [root@test2 ~]# vi nginx.yaml
  1443. spec:
  1444. containers:
  1445. - name: http-test-con
  1446. image: nginxdemos/hello
  1447. ports:
  1448. - containerPort: 80
  1449.  
  1450. 创建nginx实例
  1451.  
  1452. # 需要过几分钟,拉取镜像很慢的,
  1453.  
  1454. kubectl create -f nginx.yaml
  1455.  
  1456. 查看pod状态
  1457.  
  1458. # 注意:使用kubectl工具养成带上命名空间的习惯,虽然不带default命名空间默认带着的,但是这是个习惯,之前总是因为没有带命名空间出错,排查半天,单耽误时间,
  1459.  
  1460. kubectl get deploy -o wide -n default
  1461. kubectl get pods -o wide -n default
  1462. kubectl get svc -o wide -n default
  1463. kubectl describe svc example-service -n default
  1464.  
  1465. [root@test2 ~]# kubectl get deploy -o wide -n default
  1466. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
  1467. http-test-dm2 1 1 1 1 52m http-test-con nginxdemos/hello name=http-test-dm2
  1468.  
  1469. [root@test2 ~]# kubectl get pods -o wide -n default
  1470. NAME READY STATUS RESTARTS AGE IP NODE
  1471. http-test-dm2-76d4b58b47-f4pqm 1/1 Running 0 52m 10.244.0.12 192.168.0.92
  1472.  
  1473. [root@test2 ~]# kubectl get svc -o wide -n default
  1474. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
  1475. http-nginx-ser NodePort 10.103.38.143 <none> 80:31000/TCP 5m name=http-test-dm2
  1476. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1d <none>
  1477.  
  1478. [root@test2 ~]# kubectl describe pod http-test-dm2-76d4b58b47-f4pqm -n default
  1479.  
  1480. 容器内测试coredns解析
  1481.  
  1482. # 启动一个具有解析功能的 dns 实例,然后进到 pod 里面用 nslookup、curl 工具进行访问测试,下面这个实例启动慢,等几分钟,
  1483.  
  1484. # 如果启动失败,通过看日志得知无法拉取镜像 infoblox/dnstools,很可能这个镜像不存在了,那就通过 docker search dns 找一个dns镜像代替infoblox/dnstools镜像
  1485.  
  1486. kubectl run -it --rm --image=infoblox/dnstools dns-client
  1487. nslookup kubernetes
  1488. nslookup nginx-service
  1489. curl nginx-service
  1490.  
  1491. 执行结果:
  1492.  
  1493. [root@test2 ~]# kubectl run -it --rm --image=infoblox/dnstools dns-client
  1494. If you don't see a command prompt, try pressing enter.
  1495.  
  1496. dnstools# nslookup kubernetes
  1497. Server: 10.96.0.10
  1498. Address: 10.96.0.10#
  1499.  
  1500. Name: kubernetes.default.svc.cluster.local
  1501. Address: 10.96.0.1
  1502.  
  1503. dnstools# nslookup http-nginx-ser
  1504. Server: 10.96.0.10
  1505. Address: 10.96.0.10#
  1506.  
  1507. Name: http-nginx-ser.default.svc.cluster.local
  1508. Address: 10.103.38.143
  1509.  
  1510. dnstools# curl http-nginx-ser
  1511. <!DOCTYPE html>
  1512. <html>
  1513. <head>
  1514. <title>Hello World</title>
  1515.  
  1516. 容器外测试coredns解析
  1517.  
  1518. # 注意:是在 test2 节点进行访问访测试的,
  1519.  
  1520. # 如果此时 去 test1 节点上访问,是无法访问的,因为test1 节点上还没有安装kubelet,什么角色也不是,只要成为node或master角色 就可以访问,测试过
  1521.  
  1522. # 如果test1节点安装了 kubelet,并且是ready状态,就一定能通过 curl "10.103.38.143:80" 访问到,已经测试过,
  1523.  
  1524. # coredns 可能是节点内部域名解析,Traefik-ingress是节点外部域名解析
  1525.  
  1526. # 10.103.38.143 是查看svc时获取到的clusterip,svc是service的缩写
  1527.  
  1528. curl "10.103.38.143:80"
  1529.  
  1530. 执行结果:
  1531.  
  1532. [root@test2 ~]# curl "10.103.38.143:80" -n default
  1533. <!DOCTYPE html>
  1534. <html>
  1535. <head>
  1536. <title>Hello World</title>
  1537.  
  1538. 通过浏览器访问测试
  1539.  
  1540. # 31000 是查看svc时获取到的 nodeport
  1541.  
  1542. http://192.168.0.92:31000/
  1543.  
  1544. 22、关机重启验证
  1545.  
  1546. # 两个节点都操作
  1547.  
  1548. # test1、test2 节点都关机重启,重新执行上面的过程验证是否完好。本实验重启这两个节点后一切是正常的
  1549.  
  1550. 清理
  1551.  
  1552. kubectl delete -f nginx.yaml
  1553.  
  1554. 23、回头配置 test1 节点加入集群
  1555.  
  1556. # 只在test1 节点上操作
  1557.  
  1558. # 目的是 在 test1 节点上安装node组件,设置test1节点为master节点。
  1559.  
  1560. # 注意:不管要设置master角色 还是设置为node角色,前提必须先安装node组件,主要是kubelet 组件。就是说先把节点加入集群,才能设置角色,
  1561.  
  1562. # 加入集群就是安装启动 kubelet 组件,通过csr请求后,就可以加入集群,然后才可以设置集群角色
  1563.  
  1564. 23.1、安装docker
  1565.  
  1566. # 只在 test1 节点上操作
  1567.  
  1568. # 注意:docker和flannel是一体的,哪个节点上需要安装flannel,哪个节点上就需要安装docker
  1569.  
  1570. # docker 和kubelet组件、node状态有关系, 之前停掉docker后,kubelet组件会自动停掉;node节点会变成 NotReady 状态
  1571.  
  1572. # 但是停掉docker后,flanel、coredns 的pod 让然是 running 状态
  1573.  
  1574. # v1.11.0版本推荐使用docker v17.03, v1.11,v1.12,v1.13, 也可以使用,再高版本的docker可能无法正常使用。测试发现17.09无法正常使用,不能使用资源限制(内存CPU)
  1575.  
  1576. 卸载自带docker
  1577.  
  1578. yum remove -y docker-ce docker-ce-selinux container-selinux
  1579.  
  1580. 下载Docker镜像
  1581.  
  1582. 下载链接:https://pan.baidu.com/s/1whfkq5wDODIew5_eqP63gA
  1583. 提取码:xmqq
  1584.  
  1585. 下载链接:https://pan.baidu.com/s/1zZy_tbvuApZW2fsMPGv3Bg
  1586. 提取码:u3t3
  1587.  
  1588. 添加至镜像仓库
  1589.  
  1590. rpm -ivh docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm
  1591. rpm -ivh docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm
  1592.  
  1593. 用安装 Docker 和依赖包
  1594.  
  1595. yum install -y docker-ce-*.rpm
  1596.  
  1597. 开机启动
  1598.  
  1599. systemctl enable docker
  1600.  
  1601. 启动 docker 服务
  1602.  
  1603. systemctl start docker
  1604.  
  1605. 23.2、部署 kubelet组件
  1606.  
  1607. # 只在test1 节点上操作
  1608.  
  1609. # kubelet的作用:向 test1 发起csr请求。
  1610.  
  1611. # 初次安装完 kubelet,只要第一次启动kubelet,通过kubelet get csr 就会得到这串字符串:node-csr-Yiiv675wUCvQl3HH11jDr0cC9p3kbrXWrxvG3EjWGoE
  1612.  
  1613. 下载、解压安装包
  1614.  
  1615. mkdir -p /server/software/k8s
  1616. cd /server/software/k8s
  1617. 下载链接:https://pan.baidu.com/s/1DXahqP8nXWP1aw5pIunJrw
  1618. 提取码:9xfp
  1619. tar -xf kubernetes-server-linux-amd64.tar.gz
  1620.  
  1621. 分发kubelet二进制文件
  1622.  
  1623. # 后面kubelet启动文件需要用到kubelet二进制文件路径
  1624.  
  1625. mkdir -p /usr/local/kubernetes/bin
  1626. cp /server/software/k8s/kubernetes/server/bin/kubelet /usr/local/kubernetes/bin #这一步很关键
  1627.  
  1628. 查看组件状态
  1629.  
  1630. kubectl get componentstatuses
  1631.  
  1632. [root@test1 ~]# kubectl get componentstatuses
  1633. Unable to connect to the server: x509: certificate signed by unknown authority
  1634. # 报错原因:经过排查后发现前面操作的几个步骤中 ${KUBE_APISERVER} 这个变量写成了 ${KUBE_ 又重做了一遍,正确的结果是下面
  1635.  
  1636. [root@test2 ~]# kubectl get componentstatuses
  1637. NAME STATUS MESSAGE ERROR
  1638. scheduler Healthy ok
  1639. controller-manager Healthy ok
  1640. etcd-0 Healthy {"health": "true"}
  1641.  
  1642. 配置 /.kube/config 并且授权
  1643.  
  1644. # kubectl 默认从 ~/.kube/config 文件读取 kube-apiserver 地址、证书、用户名等信息,如果没有配置,执行 kubectl 命令时可能会出错:
  1645. # /.kube/config 和 admin.conf 内容是一样的,/.kube/config 是 admin.conf 复制过来的,改了下名字而已
  1646.  
  1647. rm -rf $HOME/.kube
  1648. mkdir -p $HOME/.kube
  1649. cp /etc/kubernetes/admin.conf $HOME/.kube/config
  1650. chown $(id -u):$(id -g) $HOME/.kube/config
  1651.  
  1652. 安装cni
  1653.  
  1654. # kubelet 的启动参数需要用到
  1655.  
  1656. cd /server/software/k8s
  1657.  
  1658. 下载链接:https://pan.baidu.com/s/1DL1v4cH2SHUfobICjKXm3Q
  1659. 提取码:puel
  1660. mkdir -p /opt/cni/bin
  1661. tar -xf cni-plugins-amd64-v0.7.1.tgz -C /opt/cni/bin
  1662. ls -l /opt/cni/bin
  1663.  
  1664. cd $HOME
  1665.  
  1666. 配置启动kubelet
  1667.  
  1668. 创建数据目录
  1669.  
  1670. mkdir -p /data/kubelet
  1671.  
  1672. 配置kubelet启动文件
  1673.  
  1674. cat >/etc/systemd/system/kubelet.service<<EOF
  1675. [Unit]
  1676. Description=Kubernetes Kubelet Server
  1677. Documentation=https://github.com/kubernetes/kubernetes
  1678. After=docker.service
  1679. Requires=docker.service
  1680.  
  1681. [Service]
  1682. WorkingDirectory=/data/kubelet
  1683. EnvironmentFile=-/etc/kubernetes/config
  1684. EnvironmentFile=-/etc/kubernetes/kubelet
  1685. ExecStart=/usr/local/kubernetes/bin/kubelet \\
  1686. \$KUBE_LOGTOSTDERR \\
  1687. \$KUBE_LOG_LEVEL \\
  1688. \$KUBELET_CONFIG \\
  1689. \$KUBELET_HOSTNAME \\
  1690. \$KUBELET_POD_INFRA_CONTAINER \\
  1691. \$KUBELET_ARGS \\
  1692. \$CADVISOR
  1693. Restart=on-failure
  1694.  
  1695. [Install]
  1696. WantedBy=multi-user.target
  1697. EOF
  1698.  
  1699. 配置参数变量文件
  1700.  
  1701. cat >/etc/kubernetes/config<<EOF
  1702. KUBE_LOGTOSTDERR="--logtostderr=true"
  1703. KUBE_LOG_LEVEL="--v=2"
  1704. EOF
  1705.  
  1706. 配置kubelet文件
  1707.  
  1708. # 注意修改kubelet文件里面的 --hostname-override= 要填写test1、test2、test3 这三个节点改成对应各自 ip ,或者各自的主机名。本实验写的是主机名
  1709.  
  1710. # 如果--hostname-override= 填写的是ip,那么kubectl get nodes 得到的name就显示ip,如果填写的是主机名,得到的name就显示主机名
  1711.  
  1712. # image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1 这个镜像跟 kubectl get componentstatuses 获取不到资源没有关系,跟docker也没有关系
  1713.  
  1714. # 但是网上搜这个镜像,说这个镜像是基础镜像,目前被墙,最好下载放到本地 registry 上
  1715.  
  1716. # 注意 kubelet配置文件里面的参数kubelet.conf 是kubelet启动后生成的,不用管,就是这样写的
  1717.  
  1718. # 注意 /etc/kubernetes/pki 目录里面只放一个ca.pem 证书,
  1719.  
  1720. # 启动kubelet后/etc/kubernetes/pki 目录里面会自动生成四个文件 kubelet.crt、kubelet.key、kubelet-client-current.pem、kubelet-client-2219-01-22-10-07-06.pem
  1721.  
  1722. # CADVISOR 表明开启cadvisor监控,然后在启动文件中加上 ExecStart=$CADVISOR 就可以通过浏览器访问cadvisor监控,否则是无法访问的,
  1723.  
  1724. cat >/etc/kubernetes/kubelet<<EOF
  1725. KUBELET_HOSTNAME="--hostname-override=test2"
  1726. KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1"
  1727. KUBELET_CONFIG="--config=/etc/kubernetes/kubelet-config.yml"
  1728. CADVISOR="--cadvisor-port=4194 --storage-driver-db='cadvisor' --storage-driver-host='localhost:8086'"
  1729. KUBELET_ARGS="--bootstrap-kubeconfig=/etc/kubernetes/kubelet-bootstrap.conf --kubeconfig=/etc/kubernetes/kubelet.conf --cert-dir=/etc/kubernetes/pki --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d"
  1730. EOF
  1731.  
  1732. 配置kubelet-config.yml文件
  1733.  
  1734. # 注意修改kubelet-config.yml相关ip,test1 test2 test3 使用各自ip
  1735.  
  1736. # 注意下面kubelet-config.yml里面的clusterDNS 地址要和coredns.yaml 里面的 clusterIP 地址保持一致。只有kubelet、coredns里面有 10.96.0.10,其他的组件都没有
  1737.  
  1738. cat >/etc/kubernetes/kubelet-config.yml<<EOF
  1739. kind: KubeletConfiguration
  1740. apiVersion: kubelet.config.k8s.io/v1beta1
  1741. address: 192.168.0.91
  1742. port: 10250
  1743. cgroupDriver: cgroupfs
  1744. clusterDNS:
  1745. - 10.96.0.10
  1746. clusterDomain: cluster.local.
  1747. hairpinMode: promiscuous-bridge
  1748. serializeImagePulls: false
  1749. authentication:
  1750. x509:
  1751. clientCAFile: /etc/kubernetes/pki/ca.pem
  1752. EOF
  1753.  
  1754. 启动
  1755. systemctl daemon-reload
  1756. systemctl enable kubelet
  1757. systemctl start kubelet # 启动后就会生成 csr
  1758. systemctl status kubelet
  1759.  
  1760. 查看日志
  1761.  
  1762. # 启动 kubelet后查看日志会有报错
  1763.  
  1764. # 报错原因是因为kubelet配置了network-plugin=cni,但是还没安装网络插件 flannel,所以状态会是NotReady,会报上面的错误,不想看这个报错或者不需要网络,就修改kubelet配置文件,去掉network-plugin=cni 就可以了
  1765.  
  1766. [root@test2 ~]# journalctl -u kubelet |tail
  1767. network plugin is not ready: cni config uninitialized
  1768.  
  1769. 23.3、通过csr请求
  1770.  
  1771. # 在 test1 节点上操作,也可以在test2 节点上操作
  1772.  
  1773. # 通过csr请求的目的就是要加入集群
  1774.  
  1775. # 注意:node-csr-Yiiv675wUCvQl3HH11jDr0cC9p3kbrXWrxvG3EjWGoE 这个长字符串是kubelet 初次启动后生成的,
  1776.  
  1777. # 在test2 节点上操作就可以
  1778.  
  1779. 查看csr
  1780.  
  1781. # 如果获取不到csr看日志会出现下面错误:
  1782.  
  1783. [root@test2 kubernetes]# journalctl -u kubelet |tail
  1784. failed to run Kubelet: cannot create certificate signing request: certificatesigningrequests.certificates.k8s.io is forbidden: User "kubelet-bootstrap" cannot create certificatesigningrequests.certificates.k8s.io at the cluster scope
  1785.  
  1786. # 原因是因为没有给kubelet-bootstrap授权,授权即可
  1787.  
  1788. kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
  1789.  
  1790. kubectl get csr
  1791.  
  1792. 执行结果
  1793.  
  1794. [root@test1 ~]# kubectl get csr
  1795. NAME AGE REQUESTOR CONDITION
  1796. node-csr-0BVhjayOeu96EHndLS4vC4bijfh9zr2gH6iJCsmfOvQ 18s kubelet-bootstrap Pending
  1797.  
  1798. 通过csr请求,下面的长字符串填写上一步的结果,
  1799.  
  1800. kubectl certificate approve node-csr-0BVhjayOeu96EHndLS4vC4bijfh9zr2gH6iJCsmfOvQ
  1801.  
  1802. [root@test1 ~]# kubectl certificate approve node-csr-0BVhjayOeu96EHndLS4vC4bijfh9zr2gH6iJCsmfOvQ
  1803. certificatesigningrequest.certificates.k8s.io/node-csr-0BVhjayOeu96EHndLS4vC4bijfh9zr2gH6iJCsmfOvQ approved
  1804.  
  1805. 查看kubelet启动后生成的文件
  1806.  
  1807. 说明:kubelet 启动后使用 --bootstrap-kubeconfig 向 kube-apiserver 发送 CSR 请求,当这个 CSR 被 approve 后,kube-controller-manager 为 kubelet 创建 TLS 客户端证书、私钥和 --kubeletconfig 文件。
  1808.  
  1809. kubelet.conf文件决定了csr的存在,如果要想重新获取csr,可以停掉kubelet,删除kubelet.conf文件,重启kubelet就可以获得csr
  1810.  
  1811. ls -l /etc/kubernetes/kubelet.conf
  1812. ls -l /etc/kubernetes/pki/kubelet*
  1813.  
  1814. 查看结果
  1815.  
  1816. [root@test2 ~]# ls -l /etc/kubernetes/kubelet.conf
  1817. -rw------- 1 root root 2295 Jan 22 10:07 /etc/kubernetes/kubelet.conf
  1818.  
  1819. [root@test2 ~]# ls -l /etc/kubernetes/pki/kubelet*
  1820. -rw------- 1 root root 1273 Jan 22 10:07 /etc/kubernetes/pki/kubelet-client-2019-01-22-10-07-06.pem
  1821. lrwxrwxrwx 1 root root 58 Jan 22 10:07 /etc/kubernetes/pki/kubelet-client-current.pem -> /etc/kubernetes/pki/kubelet-client-2019-01-22-10-07-06.pem
  1822. -rw-r--r-- 1 root root 2181 Jan 22 02:10 /etc/kubernetes/pki/kubelet.crt
  1823. -rw------- 1 root root 1675 Jan 22 02:10 /etc/kubernetes/pki/kubelet.key
  1824.  
  1825. 查看节点状态
  1826.  
  1827. # 之前做完上一步,就去吃饭了,饭后回来正想安装 flanel,突然一看 192.168.0.91是Ready状态,所以等一会状态就会发生改变
  1828.  
  1829. # 解释:此时节点状态为Ready,因为test2 节点已经安装过 flannel,这里就不需要再安装。所以只要通过csr就是ready状态,
  1830.  
  1831. [root@test1 ~]# kubectl get nodes
  1832. NAME STATUS ROLES AGE VERSION
  1833. test1 Ready <none> 2h v1.11.0
  1834. test2 Ready node 21h v1.11.0
  1835.  
  1836. 设置集群角色
  1837.  
  1838. # 在test1 节点上操作
  1839.  
  1840. # 设置 test1 为 master 角色
  1841.  
  1842. kubectl label nodes test1 node-role.kubernetes.io/master=
  1843.  
  1844. # 设置 master 一般情况下不接受负载
  1845. kubectl taint nodes test1 node-role.kubernetes.io/master=true:NoSchedule
  1846.  
  1847. master运行pod
  1848.  
  1849. kubectl taint nodes master.k8s node-role.kubernetes.io/master-
  1850.  
  1851. master不运行pod
  1852.  
  1853. kubectl taint nodes master.k8s node-role.kubernetes.io/master=:NoSchedule
  1854.  
  1855. 执行结果:
  1856.  
  1857. [root@test1 ~]# kubectl label nodes test1 node-role.kubernetes.io/master=
  1858. node/192.168.0.91 labeled
  1859.  
  1860. [root@master ~]# kubectl get nodes
  1861. NAME STATUS ROLES AGE VERSION
  1862. test1 Ready master 2h v1.11.0
  1863. test1 Ready node 21h v1.11.0
  1864.  
  1865. [root@test1 k8s]# kubectl taint nodes test1 node-role.kubernetes.io/master=true:NoSchedule
  1866. node/test1 tainted
  1867.  
  1868. 23.4、配置启动kube-proxy
  1869.  
  1870. # 只在 test1 节点上操作
  1871.  
  1872. # 注意:关掉 kube-proxy 后仍然可以访问 svc curl "10.103.38.143:80" ,kube-proxy 的作用目前还没有发现
  1873.  
  1874. 下载、解压安装包
  1875.  
  1876. mkdir -p /server/software/k8s
  1877.  
  1878. cd /server/software/k8s
  1879.  
  1880. 下载链接:https://pan.baidu.com/s/1DXahqP8nXWP1aw5pIunJrw
  1881. 提取码:9xfp
  1882.  
  1883. tar -xf kubernetes-server-linux-amd64.tar.gz
  1884.  
  1885. 分发kube-proxy二进制文件
  1886.  
  1887. # 后面kube-proxy.service启动文件需要用到kube-proxy二进制文件路径
  1888.  
  1889. mkdir -p /usr/local/kubernetes/bin
  1890. cp /server/software/k8s/kubernetes/server/bin/kube-proxy /usr/local/kubernetes/bin #这一步很关键
  1891.  
  1892. 安装依赖包
  1893.  
  1894. yum install -y conntrack-tools
  1895.  
  1896. 拷贝kube-proxy.conf文件
  1897.  
  1898. 把 test1 节点上的kube-proxy.conf复制到/etc/kubernetes/ 目录下,kube-proxy.service启动参数中proxy文件需要用到kube-proxy.conf
  1899.  
  1900. cp /etc/kubernetes/kube-proxy.conf /etc/kubernetes/
  1901.  
  1902. 配置启动文件
  1903. cat >/etc/systemd/system/kube-proxy.service<<EOF
  1904. [Unit]
  1905. Description=Kubernetes Kube-Proxy Server
  1906. Documentation=https://github.com/kubernetes/kubernetes
  1907. After=network.target
  1908.  
  1909. [Service]
  1910. EnvironmentFile=-/etc/kubernetes/config
  1911. EnvironmentFile=-/etc/kubernetes/proxy
  1912. ExecStart=/usr/local/kubernetes/bin/kube-proxy \\
  1913. \$KUBE_LOGTOSTDERR \\
  1914. \$KUBE_LOG_LEVEL \\
  1915. \$KUBECONFIG \\
  1916. \$KUBE_PROXY_ARGS
  1917. Restart=on-failure
  1918. LimitNOFILE=65536
  1919.  
  1920. [Install]
  1921. WantedBy=multi-user.target
  1922. EOF
  1923.  
  1924. 配置参数变量文件
  1925.  
  1926. # 前面配置kubelet组件时已经配置过参数变量文件,这里就不需要配置,写在这里这是知道是怎么回事
  1927.  
  1928. cat >/etc/kubernetes/config<<EOF
  1929. KUBE_LOGTOSTDERR="--logtostderr=true"
  1930. KUBE_LOG_LEVEL="--v=2"
  1931. EOF
  1932.  
  1933. 配置proxy文件
  1934.  
  1935. # 注意修改相关ip,test1 test2 test3 使用各自ip
  1936.  
  1937. # 看下面proxy文件'--proxy-mode=iptables',由于采用iptables模式,因为 ipvs 模式在centos7上有bug无法正常使用,1.11.0 以后的版本就可使用 ipvs 模式了,
  1938.  
  1939. # 本实验采用centos7.5、kubernetes 1.11.0 版本,所以使用iptables模式,
  1940.  
  1941. # 特别注意:下面的cluster-cidr地址要和controller-manager里面的cluster-cidr、flannel 里面的Network 地址保持一致,这有这三个组件里面有 10.244.0.0
  1942.  
  1943. cat >/etc/kubernetes/proxy<<EOF
  1944. KUBECONFIG="--kubeconfig=/etc/kubernetes/kube-proxy.conf"
  1945. KUBE_PROXY_ARGS="--bind-address=192.168.0.91 --proxy-mode=iptables --hostname-override=192.168.0.91 --cluster-cidr=10.244.0.0/16"
  1946. EOF
  1947.  
  1948. 启动
  1949. systemctl daemon-reload
  1950. systemctl enable kube-proxy
  1951. systemctl start kube-proxy
  1952. systemctl status kube-proxy
  1953.  
  1954. 23.5、容器外测试coredns解析
  1955.  
  1956. # 只在 test1 节点上操作
  1957.  
  1958. # 由于之前 test2节点已经安装过coredns,所以 test1节点就不需要安装了,直接测试
  1959.  
  1960. # 这里的 10.103.38.143:80 是之前在 test2 节点上查询svc 得到的结果
  1961.  
  1962. # 访问成功,
  1963.  
  1964. [root@master k8s]# curl "10.103.38.143:80"
  1965. <!DOCTYPE html>
  1966. <html>
  1967. <head>
  1968. <title>Hello World</title>
  1969.  
  1970. 23.6、浏览器访问 cadvisor监控服务
  1971.  
  1972. 浏览器访问http://192.168.0.91:4194/
  1973.  
  1974. 参照文档:
  1975. http://www.maogx.win/posts/35/
  1976. http://www.maogx.win/
  1977. https://juejin.im/user/59ffa2836fb9a0451c39c64f/posts
  1978. http://blog.itpub.net/10995764/viewspace-2124022/

k8s1.11.0安装、一个master、一个node、查看node名称是主机名、node是扩容进来的、带cadvisor监控服务的更多相关文章

  1. k8s1.11.0安装、一个master、一个node、查看node名称是ip、node是扩容进来的、带cadvisor监控服务

    一个master.一个node.查看node节点是ip # 安装顺序:先在test1 上安装完必要组件后,就开始在 test2 上单独安装node组件,实现node功能,再返回来配置test1加入集群 ...

  2. k8s1.9.0安装--完整集群部署

    三.完整集群部署 - kubernetes-with-ca 1. 理解认证授权 1.1 为什么要认证 想理解认证,我们得从认证解决什么问题.防止什么问题的发生入手.防止什么问题呢?是防止有人入侵你的集 ...

  3. CDH5.11..0安装

    1.参考: http://www.cnblogs.com/codedevelop/p/6762555.html grant all privileges on *.* to 'root'@'hostn ...

  4. k8s1.9.0安装--环境准备

    一.预先准备环境 1. 准备服务器 这里准备了三台centos虚拟机,每台一核cpu和2G内存,配置好root账户,并安装好了docker,后续的所有操作都是使用root账户.虚拟机具体信息如下表: ...

  5. hive-0.11.0安装方法具体解释

    先决条件:     1)java环境,须要安装java1.6以上版本号     2)hadoop环境,Hadoop-1.2.1的安装方法參考hadoop-1.2.1安装方法具体解释 本文採用的hado ...

  6. k8s1.9.0安装--基础集群部署

    二.基础集群部署 - kubernetes-simple 1. 部署ETCD(主节点) 1.1 简介 kubernetes需要存储很多东西,像它本身的节点信息,组件信息,还有通过kubernetes运 ...

  7. k8s1.13.0二进制部署-master节点(三)

    部署apiserver 创建生成CSR的JSON配置文件 [root@k8s-master1 ssl]# vim kubernetes-csr.json { "CN": " ...

  8. Navicat Premium 12.1.11.0安装与激活

    本文介绍Navicat Premium 12.1.11.0的安装.激活与基本使用. 博主所提供的激活文件理论支持Navicat Premium 12.0.x系列和Navicat Premium 12. ...

  9. Windows下MySQL8.0.11.0安装教程

    1.mysql下载地址:https://dev.mysql.com/downloads/installer/ 2.下载安装MySQL 8.0.11.0 https://cdn.mysql.com//D ...

随机推荐

  1. IDEA导入maven中导入net.sf.json报错的解决方法

    使用IDEA搭建Maven项目导入架包时, 添加net.sf.json的jar包的时候,代码如下: 在pom.xml文件时: <dependency> <groupId>net ...

  2. (六)监控磁盘IO

    (1)被监控端配置 #vi /etc/zabbix/zabbix_agentd.conf UnsafeUserParameters= UserParameter=custom.vfs.dev.read ...

  3. BZOJ1491 [NOI2007]社交网络[最短路计数]

    $n$非常的小,结合题目计算式可以想到$O(n^3)$暴枚$s,t,v$,看$v$在不在$s\to t$最短路上($dis_{s,v}+dis_{v,t}=dis_{s,v}$是$v$在两点最短路上的 ...

  4. python爬虫添加请求头

    request import requests headers = { # 'Accept': 'application/json, text/javascript, */*; q=0.01', # ...

  5. 7.Java Web的数据库操作

    一.环境配置(基于MySQL数据库) 1.下载MySQL数据库 2.下载安装 Navicat,破解方法去吾爱破解网站查询 第一次连接mysql时可能会出现错误,可能是因为二者对密码的编码方法不一致,可 ...

  6. jquery判断元素是否可见隐藏

    <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta nam ...

  7. AcWing:142. 前缀统计(字典树)

    给定N个字符串S1,S2…SNS1,S2…SN,接下来进行M次询问,每次询问给定一个字符串T,求S1S1-SNSN中有多少个字符串是T的前缀. 输入字符串的总长度不超过106106,仅包含小写字母. ...

  8. postgresql-基础-1

    概述 层状关系 网状关系 关系型数据库 关系型数据库 ​ 元祖:代表一行 ​ 属性:代表一列 ​ 主码:唯一确定一个元组的属性组,即主键 ​ 域:属性的取值范围 ​ 分量:元组中的一个属性值,即某一行 ...

  9. C++入门经典-例7.4-类的静态成员,我们共有一个地球

    1:静态数据在程序开始时即获得空间,直到程序结束后才被收回.静态数据可以声明在函数体内,也可以声明在函数体外. 类中的静态成员与非静态成员有很大区别.从使用上来将,调用静态成员不需要实例化对象,而是以 ...

  10. orale数据库的SQL查询

      创建学生表,成绩表,教师表,课程表,分别添加数据信息 create table student( sno ) primary key, sname ), sage ), ssex ) ); cre ...