• [问题求助] 鲲鹏平台应用软件移植调优综合实验 基于华为云鲲鹏弹性云服务器部署OA系统。
    在该课程中,我在部署安装OA系统时,需要下载classpath.txt文件,但是视频中和实验指导书中的链接已经失效,wget https://hcia.obs.cn-north-4.myhuaweicloud.com/v1.5/classpath.txt,该步骤在实验指导书第34页,4.8步骤处在网上实在不到资源,寻求大佬帮助。
  • [问题求助] isula容器启动时Execute operation failed
    使用环境:北京四-鲲鹏虚拟机,操作系统openEuler20.03使用命令:如上图,安装完isula后仅配置了镜像源docker.io(使用hub.oepkgs.net也是一样的效果)
  • [问题求助] openEuler安装高可用k8s kubesphere出现故障
    【标题描述】能够简要描述问题: 在使用kubesphere提供的kk工具安装 k8s 1.19.8和Kubesphere v3.1.0时,出现了 kubesphere组件redis-ha-haproxy组件一直无法启动的情况,通过排查内核日志及kubelet日志 ,发现该容器是被kubelet Omm kill掉, 但是服务器节点内存非常充足,3个master 节点分别是16G 、32G 、16g,空闲内存还很多,具体如下 kubelet事件操作系统内核日志Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633785] haproxy invoked oom-killer: gfp_mask=0xcc0(GFP_KERNEL), order=0, oom_score_adj=994 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633788] CPU: 1 PID: 192200 Comm: haproxy Kdump: loaded Not tainted 5.10.0-60.18.0.50.oe2203.x86_64 #1 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633789] Hardware name: OpenStack Foundation OpenStack Nova, BIOS rel-1.10.2-0-g5f4c7b1-20181220_000000-szxrtosci10000 04/01/2014 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633790] Call Trace: Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633799] dump_stack+0x57/0x6a Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633802] dump_header+0x4a/0x1f0 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633804] oom_kill_process.cold+0xb/0x10 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633808] out_of_memory+0x100/0x310 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633812] mem_cgroup_out_of_memory+0x134/0x150 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633813] mem_cgroup_oom+0x14d/0x180 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633815] try_charge+0x2b1/0x580 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633817] ? __pagevec_lru_add_fn+0x183/0x2e0 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633819] mem_cgroup_charge+0xf1/0x250 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633821] do_anonymous_page+0x1f2/0x560 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633823] __handle_mm_fault+0x3dd/0x6d0 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633824] handle_mm_fault+0xbe/0x290 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633827] exc_page_fault+0x273/0x550 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633830] ? asm_exc_page_fault+0x8/0x30 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633831] asm_exc_page_fault+0x1e/0x30 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633833] RIP: 0033:0x55a4a16d2a9a Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633835] Code: 1b 00 ff ff ff ff c7 05 2c 92 1b 00 ff ff ff ff c7 05 1e 92 1b 00 ff ff ff ff 85 ed 7e 34 66 90 48 63 c2 83 c2 01 48 c1 e0 06 <48> c7 04 03 00 00 00 00 48 8b 1d 57 3b 1b 00 48 01 d8 c7 40 18 fd Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633836] RSP: 002b:00007ffe490870e0 EFLAGS: 00010206 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633838] RAX: 000000001f254000 RBX: 00007f68f22b6010 RCX: 00007f62f22b6010 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633839] RDX: 00000000007c9501 RSI: 0000000000000000 RDI: 0000000000000000 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633840] RBP: 000000003ffffff7 R08: 00007f62f22b6010 R09: 0000000000000000 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633841] R10: 0000000000000022 R11: 0000000000000246 R12: 00007f66f22b6010 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633842] R13: 000055a4a225ec30 R14: 0000000000000001 R15: 0000000000000001 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633844] memory: usage 512000kB, limit 512000kB, failcnt 2537 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633844] memory+swap: usage 512000kB, limit 9007199254740988kB, failcnt 0 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633845] kmem: usage 0kB, limit 9007199254740988kB, failcnt 0 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633845] Memory cgroup stats for /kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podc9f031a9_b682_459c_ad9d_8fbb491edbdb.slice: Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633855] anon 524288000#012file 0#012kernel_stack 0#012percpu 0#012sock 0#012shmem 0#012file_mapped 0#012file_dirty 0#012file_writeback 0#012anon_thp 511705088#012inactive_anon 524242944#012active_anon 8192#012inactive_file 0#012active_file 0#012unevictable 0#012slab_reclaimable 0#012slab_unreclaimable 0#012slab 0#012workingset_refault_anon 0#012workingset_refault_file 14598#012workingset_activate_anon 0#012workingset_activate_file 6#012workingset_restore_anon 0#012workingset_restore_file 0#012workingset_nodereclaim 0#012pgfault 35036#012pgmajfault 561#012pgrefill 10434#012pgscan 29409#012pgsteal 17231#012pgactivate 9817#012pgdeactivate 10021#012pglazyfree 0#012pglazyfreed 0#012thp_fault_alloc 1967#012thp_collapse_alloc 0 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633856] Tasks state (memory values in pages): Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633857] [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633859] [ 186685] 1000 186685 243 1 28672 0 -998 pause Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633861] [ 192200] 1000 192200 23072522 127962 1118208 0 994 haproxy Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633862] oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=docker-be7545b7c95b6f6f011944a5e3c693363db0a18e9a4e4e089a5b4bfea1a12e28.scope,mems_allowed=0,oom_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podc9f031a9_b682_459c_ad9d_8fbb491edbdb.slice,task_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podc9f031a9_b682_459c_ad9d_8fbb491edbdb.slice/docker-be7545b7c95b6f6f011944a5e3c693363db0a18e9a4e4e089a5b4bfea1a12e28.scope,task=haproxy,pid=192200,uid=1000 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.633870] Memory cgroup out of memory: Killed process 192200 (haproxy) total-vm:92290088kB, anon-rss:511720kB, file-rss:128kB, shmem-rss:0kB, UID:1000 pgtables:1092kB oom_score_adj:994 Dec 15 21:04:20 ahsshjz-k8smaster01 kernel: [16704.637227] oom_reaper: reaped process 192200 (haproxy), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB 以上操作系统日志,我配置的haproxy最大limit限制为500M 出现 oom 以下日志为我配置pod limit限制为1500M 启动仍然是oom Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159234] haproxy invoked oom-killer: gfp_mask=0xcc0(GFP_KERNEL), order=0, oom_score_adj=997 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159237] CPU: 0 PID: 269263 Comm: haproxy Kdump: loaded Not tainted 5.10.0-60.18.0.50.oe2203.x86_64 #1 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159238] Hardware name: OpenStack Foundation OpenStack Nova, BIOS rel-1.10.2-0-g5f4c7b1-20181220_000000-szxrtosci10000 04/01/2014 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159239] Call Trace: Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159246] dump_stack+0x57/0x6a Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159250] dump_header+0x4a/0x1f0 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159252] oom_kill_process.cold+0xb/0x10 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159255] out_of_memory+0x100/0x310 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159259] mem_cgroup_out_of_memory+0x134/0x150 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159261] mem_cgroup_oom+0x14d/0x180 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159262] try_charge+0x2b1/0x580 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159265] ? __pagevec_lru_add_fn+0x183/0x2e0 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159266] mem_cgroup_charge+0xf1/0x250 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159268] do_anonymous_page+0x1f2/0x560 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159271] __handle_mm_fault+0x3dd/0x6d0 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159272] handle_mm_fault+0xbe/0x290 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159275] exc_page_fault+0x273/0x550 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159278] ? asm_exc_page_fault+0x8/0x30 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159279] asm_exc_page_fault+0x1e/0x30 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159281] RIP: 0033:0x562cc41baa9a Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159283] Code: 1b 00 ff ff ff ff c7 05 2c 92 1b 00 ff ff ff ff c7 05 1e 92 1b 00 ff ff ff ff 85 ed 7e 34 66 90 48 63 c2 83 c2 01 48 c1 e0 06 <48> c7 04 03 00 00 00 00 48 8b 1d 57 3b 1b 00 48 01 d8 c7 40 18 fd Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159284] RSP: 002b:00007ffcc9b32e70 EFLAGS: 00010206 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159286] RAX: 000000005da52000 RBX: 00007f58a8a43010 RCX: 00007f52a8a43010 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159286] RDX: 0000000001769481 RSI: 0000000000000000 RDI: 0000000000000000 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159287] RBP: 000000003ffffff7 R08: 00007f52a8a43010 R09: 0000000000000000 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159288] R10: 0000000000000022 R11: 0000000000000246 R12: 00007f56a8a43010 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159289] R13: 0000562cc4afcc30 R14: 0000000000000001 R15: 0000000000000001 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159290] memory: usage 1536000kB, limit 1536000kB, failcnt 1668 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159291] memory+swap: usage 1536000kB, limit 9007199254740988kB, failcnt 0 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159292] kmem: usage 0kB, limit 9007199254740988kB, failcnt 0 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159292] Memory cgroup stats for /kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod655eac53_2a9d_4db8_b083_b4776263d81b.slice: Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159302] anon 1572851712#012file 12288#012kernel_stack 0#012percpu 0#012sock 0#012shmem 0#012file_mapped 0#012file_dirty 0#012file_writeback 0#012anon_thp 1560281088#012inactive_anon 1572843520#012active_anon 8192#012inactive_file 4096#012active_file 8192#012unevictable 0#012slab_reclaimable 0#012slab_unreclaimable 0#012slab 0#012workingset_refault_anon 0#012workingset_refault_file 8857#012workingset_activate_anon 0#012workingset_activate_file 0#012workingset_restore_anon 0#012workingset_restore_file 0#012workingset_nodereclaim 0#012pgfault 20892#012pgmajfault 293#012pgrefill 5615#012pgscan 14815#012pgsteal 8858#012pgactivate 5191#012pgdeactivate 5192#012pglazyfree 0#012pglazyfreed 0#012thp_fault_alloc 2987#012thp_collapse_alloc 0 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159303] Tasks state (memory values in pages): Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159303] [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159305] [ 267934] 1000 267934 243 1 28672 0 -998 pause Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159307] [ 269263] 1000 269263 23072522 383961 3166208 0 997 haproxy Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159308] oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=docker-4db120f25d7ff16eba42ef22d3daef5201050bb61ff51f460f843c2e8cc62975.scope,mems_allowed=0,oom_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod655eac53_2a9d_4db8_b083_b4776263d81b.slice,task_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod655eac53_2a9d_4db8_b083_b4776263d81b.slice/docker-4db120f25d7ff16eba42ef22d3daef5201050bb61ff51f460f843c2e8cc62975.scope,task=haproxy,pid=269263,uid=1000 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.159317] Memory cgroup out of memory: Killed process 269263 (haproxy) total-vm:92290088kB, anon-rss:1535832kB, file-rss:12kB, shmem-rss:0kB, UID:1000 pgtables:3092kB oom_score_adj:997 Dec 15 22:22:52 ahsshjz-k8snode2 kernel: [23041.164890] oom_reaper: reaped process 269263 (haproxy), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB配置15000M 依然是启动haproxy 会达到最大内存限制,而被KillDec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922789] haproxy invoked oom-killer: gfp_mask=0xcc0(GFP_KERNEL), order=0, oom_score_adj=997 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922793] CPU: 6 PID: 369292 Comm: haproxy Kdump: loaded Not tainted 5.10.0-60.18.0.50.oe2203.x86_64 #1 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922794] Hardware name: OpenStack Foundation OpenStack Nova, BIOS rel-1.10.2-0-g5f4c7b1-20181220_000000-szxrtosci10000 04/01/2014 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922795] Call Trace: Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922802] dump_stack+0x57/0x6a Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922806] dump_header+0x4a/0x1f0 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922808] oom_kill_process.cold+0xb/0x10 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922811] out_of_memory+0x100/0x310 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922815] mem_cgroup_out_of_memory+0x134/0x150 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922816] mem_cgroup_oom+0x14d/0x180 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922817] try_charge+0x2b1/0x580 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922821] ? free_one_page+0x1f4/0x510 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922823] mem_cgroup_charge+0xf1/0x250 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922824] do_anonymous_page+0x1f2/0x560 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922826] __handle_mm_fault+0x3dd/0x6d0 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922830] ? timerqueue_add+0x96/0xb0 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922831] handle_mm_fault+0xbe/0x290 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922834] exc_page_fault+0x273/0x550 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922837] ? asm_exc_page_fault+0x8/0x30 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922838] asm_exc_page_fault+0x1e/0x30 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922840] RIP: 0033:0x5577fa027a9a Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922842] Code: 1b 00 ff ff ff ff c7 05 2c 92 1b 00 ff ff ff ff c7 05 1e 92 1b 00 ff ff ff ff 85 ed 7e 34 66 90 48 63 c2 83 c2 01 48 c1 e0 06 <48> c7 04 03 00 00 00 00 48 8b 1d 57 3b 1b 00 48 01 d8 c7 40 18 fd Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922843] RSP: 002b:00007fffa81993b0 EFLAGS: 00010206 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922844] RAX: 00000003a9650000 RBX: 00007fb74efb9010 RCX: 00007fb14efb9010 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922845] RDX: 000000000ea59401 RSI: 0000000000000000 RDI: 0000000000000000 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922846] RBP: 000000003ffffff7 R08: 00007fb14efb9010 R09: 0000000000000000 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922846] R10: 0000000000000022 R11: 0000000000000246 R12: 00007fb54efb9010 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922847] R13: 00005577fa8d5c30 R14: 0000000000000001 R15: 0000000000000001 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922849] memory: usage 15360000kB, limit 15360000kB, failcnt 241 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922850] memory+swap: usage 15360000kB, limit 9007199254740988kB, failcnt 0 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922851] kmem: usage 0kB, limit 9007199254740988kB, failcnt 0 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922851] Memory cgroup stats for /kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podee31ec4d_d8b6_456a_98b3_2c6617f23c31.slice: Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922861] anon 15728541696#012file 98304#012kernel_stack 0#012percpu 0#012sock 0#012shmem 0#012file_mapped 98304#012file_dirty 0#012file_writeback 0#012anon_thp 15720251392#012inactive_anon 15728500736#012active_anon 8192#012inactive_file 0#012active_file 98304#012unevictable 0#012slab_reclaimable 0#012slab_unreclaimable 0#012slab 0#012workingset_refault_anon 0#012workingset_refault_file 4190#012workingset_activate_anon 0#012workingset_activate_file 0#012workingset_restore_anon 0#012workingset_restore_file 0#012workingset_nodereclaim 0#012pgfault 33424#012pgmajfault 126#012pgrefill 2056#012pgscan 7287#012pgsteal 4167#012pgactivate 2080#012pgdeactivate 2056#012pglazyfree 0#012pglazyfreed 0#012thp_fault_alloc 22494#012thp_collapse_alloc 0 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922862] Tasks state (memory values in pages): Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922862] [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922865] [ 367900] 1000 367900 243 1 28672 0 -998 pause Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922866] [ 369292] 1000 369292 23072523 3840521 30867456 0 997 haproxy Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922868] oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=docker-214e3028cd48ecd5b091803d52122ea5f0bc2a1b40c2b8ddb7e4470d7c41a412.scope,mems_allowed=0,oom_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podee31ec4d_d8b6_456a_98b3_2c6617f23c31.slice,task_memcg=/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podee31ec4d_d8b6_456a_98b3_2c6617f23c31.slice/docker-214e3028cd48ecd5b091803d52122ea5f0bc2a1b40c2b8ddb7e4470d7c41a412.scope,task=haproxy,pid=369292,uid=1000 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.922876] Memory cgroup out of memory: Killed process 369292 (haproxy) total-vm:92290092kB, anon-rss:15359908kB, file-rss:2176kB, shmem-rss:0kB, UID:1000 pgtables:30144kB oom_score_adj:997 Dec 15 22:26:26 ahsshjz-k8snode3 kernel: [22376.949848] oom_reaper: reaped process 369292 (haproxy), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB问题如上,请问我应该如何处理该问题,以上问题在centos7环境中未出现 目前发现 我部署mysql8.0 容器也会出现以上问题 【环境信息】 硬件信息: 1) 虚拟机.x86架构 2) 官方提供的虚拟机镜像 软件信息: 1) openeuler 22.03lts 2) 5.10.0-60.18.0.50.oe2203.x86_64 3) k8s v1.19.8 kubesphere v3.1.0 harproxy镜像 registry.cn-beijing.aliyuncs.com/kubesphereio/haproxy:2.0.4【问题复现步骤】 3台 openeuler 22.03lts,3个master节点 使用Kubesphere 官方提供的 kk工具创建集群 ./kk create config --with-kubernetes v1.19.8 --with-kubesphere v3.1.0 -f config-sample.yaml ./kk create cluster -f config-sample.yaml 出现概率(必现) 内核sysctl.conf配置内容如下kernel.sysrq=0 net.ipv4.ip_forward = 1 net.ipv4.conf.all.send_redirects=0 net.ipv4.conf.default.send_redirects=0 net.ipv4.conf.all.accept_source_route=0 net.ipv4.conf.default.accept_source_route=0 net.ipv4.conf.all.accept_redirects=0 net.ipv4.conf.default.accept_redirects=0 net.ipv4.conf.all.secure_redirects=0 net.ipv4.conf.default.secure_redirects=0 net.ipv4.icmp_echo_ignore_broadcasts=1 net.ipv4.icmp_ignore_bogus_error_responses=1 net.ipv4.conf.all.rp_filter=1 net.ipv4.conf.default.rp_filter=1 net.ipv4.tcp_syncookies=1 kernel.dmesg_restrict=1 net.ipv6.conf.all.accept_redirects=0 net.ipv6.conf.default.accept_redirects=0
  • [公告] linux 入门指令
    文件管理命令 df命令 df命令描述:该命令检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。df命令语法:df [参数] [目录或文件名] 参数说明:参数 说明 -a 列出所有的文件系统,包括系统特有的/proc等文件系统。 -k 以KBytes为单位,返回各文件系统容量。 -m 以MBytes为单位,返回各文件系统容量。 -h 以GBytes、MBytes、KBytes为单位,返回各文件系统容量。 -H 以M=1000K取代M=1024K的进位方式显示各文件系统容量。 -T 显示文件系统类型。 -i 显示inode信息。 df命令使用示例:示例一:显示磁盘使用情况。执行如下命令,显示磁盘使用情况。df 返回结果如下所示。img示例三:显示系统内的所有特殊文件格式、名称及磁盘使用情况。执行如下命令,显示系统内的所有特殊文件格式、名称及磁盘使用情况。df -aT 返回结果如下所示。img示例四:以GBytes、MBytes、KBytes等格式显示各文件系统容量。执行如下命令,以GBytes、MBytes、KBytes等格式显示各文件系统容量。df -h 返回结果如下所示。imgdu命令 du命令描述:查看磁盘使用空间。du与df命令不同点在于,du命令用于查看文件和目录磁盘的使用空间。du命令语法:du [参数] [文件或目录名称] 参数说明:参数 说明 -a 列出所有的文件与目录容量。 -h 以G、M、K为单位,返回容量。 -s 列出总量。 -S 列出不包括子目录下的总量。 -k 以KBytes为单位,返回容量。 -m 以MBytes为单位,返回容量。 du命令使用示例:示例一:列出当前目录下的所有文件夹的容量。执行如下命令,列出当前目录下的所有文件夹的容量。du 返回结果如下所示。img示例二:列出当前目录下的所有文件夹和文件的容量。执行如下命令,列出当前目录下的所有文件夹和文件的容量。du -a 返回结果如下所示。img示例三:列出当前目录下的所有文件夹和文件的容量,并以G、M、K格式显示容量。执行如下命令,列出当前目录下的所有文件夹和文件的容量。du -ah 返回结果如下所示。img示例四:列出根目录底下每个目录所占用的容量,并以MBytes单位显示容量。执行如下命令,列出根目录底下每个目录所占用的容量,并以MBytes单位显示容量。du -sm /* 返回结果如下所示。imgfdisk命令 fdisk命令描述:该命令用于磁盘分区。fdisk命令语法:fdisk [-l] 装置名称 参数说明:参数 说明 -l 输出后面装置名称的所有的分区内容。若仅有 fdisk -l时, 则系统将会把整个系统内能够搜寻到的装置的分区均列出来。 fdisk命令使用示例:示例一:列出系统所有装置的分区信息。执行如下命令,列出系统所有装置的分区信息。fdisk -l 返回结果如下所示。img示例二:列出系统中的根目录所在磁盘,并查阅该硬盘内的相关信息。a. 执行如下命令,找出根目录所在磁盘名。df / 返回结果如下所示。imgb. 执行如下命令,对磁盘/dev/vda进行分区操作。fdisk /dev/vda 注意:对磁盘进行分区操作时,磁盘名不包含数字。返回结果如下所示。imgc. 执行如下命令,获取帮助。m 返回结果如下所示。img执行如下命令,查看磁盘状态。p 返回结果如下所示,您可以查看到磁盘的相关状态。imgd. 执行如下命令,不存储任何操作并离开。q 文件目录管理命令 ls命令 命令描述: ls命令用于显示指定工作目录下的内容。命令格式:ls [参数] [目录名]。参数说明:参数 说明 -a 显示所有文件及目录(包括隐藏文件) -l 将文件的权限、拥有者、文件大小等详细信息列出(ll等同于ls -l) -r 将文件反序列出(默认按英文字母正序) -t 将文件按创建时间正序列出 -R 递归遍历目录下文件 命令使用示例:查看当前目录下的所有文件(包括隐藏文件)。ll -a 命令输出结果:imgpwd命令 命令描述:获取当前工作目录的绝对路径。命令使用示例:imgcd命令 命令描述:cd命令用于切换工作目录。命令使用示例:img在路径表示中:一个半角句号(.)表示当前目录,例如路径./app/log等同于app/log。两个半角句号(..)表示上级目录,例如路径/usr/local/../src等同于/usr/src,其中local和src目录同级。cd命令的默认参数为,符号表示当前用户的家目录,即在root用户登录时,命令cd、cd ~和cd /root执行效果相同。touch命名 命令描述:touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。命令格式:touch [参数] [文件]。参数说明:参数 说明 -c 如果指定文件不存在,不会建立新文件 -r 使用参考文件的时间记录 -t 设置文件的时间记录 命令使用示例:创建两个空文件。touch demo1.txt demo2.txt img修改demo1.txt的时间记录为当前系统时间。img更新demo2.txt的时间记录,使其和demo1.txt的时间记录相同。imgmkdir命令 命令描述:mkdir命令用于新建子目录。-p参数确保目录名称存在,不存在的就新建一个。mkdir -p a/b/c/d 命令使用示例:新建目录a/b/c/d,并使用tree命令查看创建后的目录结构。tree imgrm命令 命令描述:rm命令用于删除一个文件或者目录。命令格式:rm [参数] [文件]。参数说明:参数 说明 -i 删除前逐一询问确认 -f 无需确认,直接删除 -r 删除目录下所有文件 命令使用示例:无需确认直接删除文件。rm -rf demo* img无需确认直接删除目录a及其目录下所有子目录和文件。rm -rf a cp命令 命令描述: cp命令主要用于复制文件或目录。命令格式:cp [参数] [源文件] [目标文件]。参数说明:参数 说明 -d 复制时保留链接 -f 覆盖已经存在的目标文件而不给出提示 -i 覆盖前询问 -p 除复制文件的内容外,还把修改时间和访问权限也复制到新文件中 -r 复制目录及目录内的所有项目 命令使用示例:将目录c/d中的所有内容复制到目录a/b下。mv命令 命令描述: mv命令用来为文件或目录改名、或将文件或目录移入其它位置。命令格式:mv [参数] [源文件] [目标文件]参数说明:参数 说明 -i 若指定目录已有同名文件,则先询问是否覆盖旧文件 -f 如果目标文件已经存在,不会询问而直接覆盖 命令使用示例:将文件名a.txt改为b.txt。 img将c目录移动到a/b/c/d/下。 img将当前目录内容全部移动到/tmp目录中。mv ./* /tmp rename命令 命令描述:rename命令用字符串替换的方式批量改变文件名。rename命令有C语言和Perl语言两个版本,这里介绍C语言版本的rename命令,不支持正则表达式。命令使用示例:将当前目录下所有文件名中的字符串demo改为大写的字符串DEMO。 img将当前目录下所有.txt文件后缀都改为text。 img\4. 文件权限ls命令可以查看Linux系统上的文件、目录和设备的权限。img上述ls -l命令中显示的第一列就是文件权限信息,共11位字符,分5部分。第1位表示存档类型,d表示目录,-表示一般文件。第2~4位表示当前用户的权限(属主权限)。第5~7位表示同用户组的用户权限(属组权限)。第8~10位表示不同用户组的用户权限(其他用户权限)。第11位是一个半角句号.,表示SELinux安全标签。用户权限每组三位,rwx分别表示读、写、执行权限,对应八进制表示为4、2、1。例如efi目录的root用户权限为drwxr-xr-x.。该目录对root用户具有读写和执行所有权限。该目录对root组其他用户有读和执行权限。该目录对其他用户有读和执行权限。所以该权限表示对应八进制权限表示为:属主权限:4+2+1=7。属组权限:4+1=5。其他用户权限:4+1=5。即755。chmod命令 chmod命令用于修改文件权限mode,-R参数以递归方式对子目录和文件进行修改。命令使用示例:新建名为hello.sh的Shell脚本,该脚本将会输出Hello World。用ll命令可以看到新建的脚本没有执行权限,其权限用八进制表示为644。img将hello.sh文件增加属主的执行权限。 img将hello.sh文件撤销属主的执行权限。 img将hello.sh文件权限修改为八进制表示的744权限。 img使用bash命令解释器执行hello.sh脚本文件。 img其中,u+x表示增加属主的执行权限,u表示属主,g表示属组,o表示其他,a表示所有用户。chown命令 chown命令修改文件的属主和属组;-R参数以递归方式对子目录和文件进行修改;ls -l命令显示的第三列和第四列就是文件的属主和属组信息。命令使用示例:新建一个文本文件test.txt,用ll命令可以看到该文件的属主和属组是root。whoami命令可以查看当前Shell环境登录的用户名。img创建两个用户。imgimg修改test.txt文件的属主用户为test。 img修改test.txt文件的属主和属组为admin。 imgchgrp命令 chgrp命令用于修改文件的属组。命令使用示例:将test.txt文件的属组改为root。img磁盘管理命令 cat命令 cat命令描述:该命令用于连接文件并打印到标准输出设备上。cat命令语法:cat [参数] [文件名] 参数说明:参数 说明 -n 由1开始对所有输出的行数进行编号。 -b 由1开始对所有输出的行数进行编号,对于空白行不编号。 -s 当遇到有连续两行以上的空白行,就替换为一行的空白行。 -E 在每行结束处显示$。 -T 将 TAB 字符显示为^I。 cat命令使用示例:a. 执行如下命令,将一个自增序列写入test1.txt文件中。for i in $(seq 1 10); do echo $i >> test1.txt ; done imgb. 执行如下命令,查看文件test1.txt内容。cat test1.txt 返回结果如下所示。imgc. 执行如下命令,将test1.txt的文件内容加上行号后输入到test2.txt文件。cat -n test1.txt > test2.txt imgd. 执行如下命令,查看文件test2.txt内容。cat test2.txt 返回结果如下所示。imge. 执行如下命令,将test1.txt文件内容清空。cat /dev/null > test1.txt imgf. 执行如下命令,查看文件test1.txt内容。cat test1.txt 返回结果如下所示,您可以看到test1.txt文件没有任何内容。imgcmp命令 cmp命令描述:该命令用于比较两个文件是否有差异。当相互比较的两个文件完全一样时,该指令不会显示任何信息。否则会标示出第一个不同之处的字符和列数编号。当不指定任何文件名称,或文件名为"-",则cmp指令会从标准输入设备读取数据。cmp命令语法:cmp [-clsv][-i <字符数目>][--help][第一个文件][第二个文件] 参数说明:参数 说明 -c 除了标明差异处的十进制字码之外,一并显示该字符所对应字符。 -i <字符数目> 指定一个数目。 -l 标示出所有不一样的地方。 -s 不显示错误信息。 -v 显示版本信息。 --help 在线帮助。 cmp命令使用示例:a. 执行如下命令,将一个自增序列1-5写入test1.txt文件中。for i in $(seq 1 5); do echo $i >> test1.txt ; done imgb. 执行如下命令,比较test1.txt文件和test2.txt文件是否相同。cmp test1.txt test2.txt 返回结果如下所示,您可以看到test1.txt文件和test2.txt文件第一行就有不同之处。img####diff命令diff命令描述:该命令用于比较文件的差异。diff命令以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。diff命令语法:diff [参数] [文件或目录1] [文件或目录2] 参数说明:参数 说明 -<行数> 指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。 -c 显示全部内文,并标出不同之处。 -u 以合并的方式来显示文件内容的不同。 -a diff预设只会逐行比较文本文件。 -b 不检查空格字符的不同。 -d 使用不同的演算法,以较小的单位来做比较。 -i 不检查大小写的不同。 -y 以并列的方式显示文件的异同之处。 -W<宽度> 在使用-y参数时,指定栏宽。 diff命令使用示例:执行如下命令,比较test1.txt文件和test2.txt文件,以并排格式输出。diff test1.txt test2.txt -y -W 50 img返回结果如下所示,您可以看到test1.txt文件和test2.txt文件的不同之处。imgfile命令 file命令描述:该命令用于辨识文件类型。file命令语法:file [参数] [文件] 参数说明:参数 说明 -b 列出辨识结果时,不显示文件名称。 -c 详细显示指令执行过程,便于排错或分析程序执行的情形。 -f<名称文件> 指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称。 -L 直接显示符号连接所指向的文件的类别。 -v 显示版本信息。 -z 解读压缩文件的内容。 file命令使用示例:a. 执行如下命令,显示test1.txt文件类型。file test1.txt img返回结果如下所示,您可以看到test1.txt文件类型是ASCII text。imgb. 执行如下命令,显示test2.txt文件类型并不显示文件名称。file -b test2.txt imgfind命令 find命令描述:该命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。find命令语法:find [参数] [文件] 参数说明:参数 说明 -mount 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件。 -amin n 在过去n分钟内被读取过文件。 -type c 文件类型是c的文件。 -cmin n 在过去n分钟内被修改过。 -name name 查找文件名称为name的文件。 find命令使用示例:a. 执行如下命令,将当前目录及其子目录下所有文件后缀为.txt的文件列出来。find . -name "*.txt" img返回结果如下所示。imgb. 执行如下命令,查找系统中所有文件长度为0的普通文件,并列出它们的完整路径。find / -type f -size 0 -exec ls -l {} ; img返回结果如下所示。
  • 操作目的和应用场景
    一、操作目的和应用场景(一)目的CentOS 8系统启用selinux并实施强制访问控制。(二)简介安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。SELinux主要由美国国家安全局开发。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。设想一下,如果一个以 root 身份运行的网络服务存在 0day 漏洞,黑客就可以利用这个漏洞,以 root 的身份在您的服务器上为所欲为了。是不是很可怕?SELinux 就是来解决这个问题的。二、操作步骤(一)selinux**的工作模式1、 selinux的三种工作模式SELinux 有三种工作模式,分别是:enforcing //强制模式。违反 SELinux 规则的行为将被阻止并记录到日志中permissive //宽容模式。违反 SELinux 规则的行为只会记录到日志中。一般为调试用disabled //关闭 SELinuxSELinux 工作模式可以在/etc/selinux/config中设置。如果想从disabled切换到enforcing或者permissive的话,需要重启系统。反过来也一样。enforcing 和 permissive 模式可以通过 setenforce 1|0 命令快速切换。2、 启用selinux(1) 临时启用**selinuxsetenforce 1(2) 永久启用**selinuxvi /etc/selinux/config //编辑配置文件将SELINUX=disabled改为SELINUX=enforcing保存退出。重启后生效。reboot //重启计算机getenforce //查看selinux工作模式/usr/sbin/sestatus -v //查看selinux工作状态详情当前selinux的状态为enabled,工作模式为enforcing,策略为targeted,说明selinux已经正常工作了。反之,如果要禁用selinux,临时的方法是setenforce 0,持久化的方法是修改配置文件,设置SELINUX=disabled,并重启使之生效。(二)selinux的策略**和规则1、 selinux的策略系统中通常有大量的文件和进程,为了节省时间和开销,通常我们只是选择性地对某些进程进行管制。而哪些进程需要管制、要怎么管制是由策略决定的。在 CentOS系统中,有三套策略,分别是:targeted //对大部分网络服务进程进行管制,是默认的策略minimum //以targeted为基础,仅对选定的网络服务进程进行管制。一般不用。mls //多级安全保护。对所有的进程进行管制,这是最严格的策略,配置难度非常大。一般不用,除非对安全性有极高的要求。策略可以在/etc/selinux/config文件中指定。2、 selinux的规则一套策略里面有许多规则,其中部分规则可以按照需求启用或禁用,这些规则称为布尔型规则。规则是模块化、可扩展的。在安装新的应用程序时,应用程序可通过添加新的模块来添加规则。用户也可以手动地增减规则。3、 使用seinfo查看selinux的策略信息seinfo - SELinux policy information toolseinfo //不加参数运行,查看策略文件以及文件所包含的内容从输出可以看到,策略中包含Users、Roles、Types、Boleans,它们分别是用户、角色、类型和布尔型规则。下面分别查看:seinfo -r //查看selinux的所有角色(role)当前有14个selinux角色。seinfo -u //列出selinux的所有身份表示(user)当前有8个selinux用户seinfo -t //查看selinux的所有类型(type)可以看到,当前系统中selinux的类型有4940个。seinfo -b //列出所有布尔型规则当前有330条布尔型selinux规则。seinfo -b | grep nfs //-b --bool,查看与nfs相关的布尔型规则4、 使用sesearch查询selinux策略的详情sesearch是SELinux的策略查询工具,使用方法如下:sesearch --allow | grep \ cluster_t\ //查看主体类型为cluster_t的allow规则sesearch --allow | grep \ cluster_t: //查看客体类型为cluster_d的allow规则5、 使用setsebool开关一个布尔规则setsebool [选项] <规则名称> <on|off>setsebool -P httpd_anon_write on开关代表切换selinux规则的生效状态。运行成功后不显示任何信息。(三)selinux的**安全上下文1、 什么是安全上下文?安全上下文分为“进程安全上下文”和“文件安全上下文”。一个“进程安全上下文”一般对应多个“文件安全上下文”。只有两者的安全上下文对应上了,进程才能访问文件。它们的对应关系由策略中的规则决定。文件安全上下文由文件创建的位置和创建文件的进程所决定。而且系统有一套默认值,用户也可以对默认值进行设定。需要注意的是,单纯的移动文件操作并不会改变文件的安全上下文。2、 安全上下文间结构和含义安全上下文有四个字段,分别用冒号隔开。形如:system_u:object_r:admin_home_t:s0。3、 查看安全上下文(1) 查看文件的安全上下文ls -Z /var/www/htmp //查看目录的安全上下文可以看到/var/www/html/目录的selinux类型为http_sys_content_t(2) 查看进程的安全上下文ps auxZ | grep -v grep | grep httpd可以看到,httpd进程的selinux类型为http_t,且存在多个httpd进程,具有相同的安全上下文。注意,进程的安全上下文不同于其可执行文件的安全上下文。为什么httpd进程可以访问/var/www/html目录?因为当前存在着相应的允许主体httpd_t访问客体http_sys_content_t进行相关操作的的selinux规则。4、 修改文件安全上下文下面通过一个例子了解修改文件安全上下文的方法:(1) 创建测试文件//在/var/www/html目录中创建测试文件:echo index.html > /var/www/html/index.html//查看文件的安全上下文ls -Z /var/www/html/index.html可以看到,文件的selinux type为httpd_sys_content_t//在/root目录创建另一个测试文件echo index1.html > /root/index1.html//将测试文件移动到/var/www/html/目录中mv /root/index1.html /var/www/html/index1.html//查看测试文件的安全上下文ls -Z /var/www/html/index1.html可以看到,index1.html文件的selinux类型为admin_home_t。这是因为文件的安全上下文不会因为文件被移动而发生变化。//使用links远程访问index.html文件links 192.168.242.164/index.html访问成功。//远程主机使用links访问index1.html文件links 192.168.242.164/index1.html提示没有权限访问index1.html。这是因为不存在允许类型为httpd_t的主体访问类型为admin_home_t的客体文件并进行读取操作的规则。可使用下面的命令查找符合条件的规则:sesearch -s httpd_t -t admin_home_t -c file -p read --allow找不到符合要求的规则条目。要想解决这个问题,要么修改/var/www/html/index1.html文件的安全上下文,将类型修改为httpd_sys_content_t或其它已经被允许访问的类型;要么新建一条规则,允许httpd_t类型的主体对admin_home_t类型的客体文件进行读取操作。这里介绍第一种方式,即修改文件的安全上下文。(2) 使用chcon修改文件的安全上下文//使用chcon命令指定文件上下文中的类型,chcon命令的使用方法如下:chcon <选项> <文件或目录1> [<文件或目录n>]//一种方法是使用-t选项直接指定类型chcon -t httpd_sys_content_t /var/www/html/index1.html//尝试远程访问index1.html文件links 192.168.242.164/index1.html访问成功。说明index1.html文件安全上下文的修改生效了。另一种方法是使用--reference选项复制其它文件的安全上下文//再次将index1.html文件的type修改为admin_home_tchcon -t admin_home_t /var/www/html/index1.htmlchcon --referece=/var/www/html/index.html /var/www/html/index1.html文件的安全上下文修改成功。文件安全上下文中的类型设置成了httpd_sys_content_t,自然可以被httpd进程访问,因此不再使用links验证。(3) 使用restorecon自动为文件设置正确的安全上下文ls -Z /var/www/html/index1.html //查看安全上下文restorecon /var/www/html/index1.html //自动设置安全上下文文件安全上下文修改成功。5、 修改目录的安全上下文通过一个例子了解修改目录及其中文件的安全上下文的方法。(1) 创建测试目录和网页//在/root目录创建目录mkdir /root/myweb///创建网页echo myweb > /root/myweb/myweb.html//测试目录移动到/var/www/html/mv /root/myweb /var/www/html///查看移动后的测试目录的安全上下文ls -dZ /var/www/html/myweb///查看移动后的测试目录中网页的安全上下文ls -Z /var/www/html/myweb/myweb.html//使用links远程访问index.html文件links 192.168.242.164/myweb/myweb.html产生错误的原因和前面的例子一样,都是因为没有相应的selinux规则。像上面一样,我们修改文件的安全上下文中的类型。chcon -t httpd_sys_content_t /var/www/html/myweb/myweb.html
  • [交流分享] EulerOS的安全性考虑
    EulerOS团队尽最大的努力保障客户的安全,并且我们将软件安全视为一个持续发展的过程,执行以下措施:迅速对安全事件做出反应,并提供高品质的安全更新。持续改进EulerOS产品中与安全相关功能。持续促进开源软件的快速成长。尊重开源软件开放性、透明性和可追溯性的安全原则。软件系统的安全是一个复杂的挑战,它涉及到软件编码、用户管理、系统运维等方方面面。同时,随着时代发展和科技进步,新的安全风险会层出不穷。EulerOS安全团队持续地关注和处理软件安全的所有问题,保障客户系统的安全。安全的两个方面 系统软件通常会提供一系列的安全功能,例如身份验证方法、加密、入侵防御/检测、备份等;另外,它还可能包含会影响系统安全性的错误,包括设计缺陷,编程错误和后门等。EulerOS安全团队的目标是及时发现安全相关的错误并提供解决方案,提供强大易用的安全特性,降低安全风险,保障用户系统的安全。安全特性:当前Linux操作系统都具有丰富的安全功能,包括访问控制、入侵防御/检测、灵活可靠的身份验证机制、文件和网络连接加密、文件完整性检查、网络分析工具和监控/日志工具等。还有一些高级工具,帮助您安全地配置和管理您的系统,下载和安装更新包。系统更新包能够修复EulerOS产品中发现的安全漏洞。系统中的安全功能和特性,需要用户去学习如何使用和配置;利用这些功能,用户能够进一步提高默认情况下系统的隐私和安全级别。安全漏洞:软件都是由程序员编写,尽管有很多流程以及质量上的措施,也无法保证完全没有错误。在这些错误中,有一些可能会导致软件或整个系统崩溃,而另外一些则不会对系统造成这么大的影响,通常难以被发现,却可能引入安全风险。本地或远程攻击者能够利用软件的编程错误,将恶意数据导入到软件中,导致应用程序崩溃,拒绝服务,或者执行来自攻击者的代码,对系统程序进行控制。这样的安全漏洞会对用户的系统和数据带来很高的安全风险,攻击者可以删除、篡改或甚至窃取用户的数据,或者通过用户系统执行非法操作。我们为安全所做的努力对EulerOS系统中使用的软件进行仔细的甄别筛选。开发安全相关的工具和应用程序。定期对开源软件进行源代码审计。源代码审计是程序员为实现软件功能而写的详细深入分析。监视安全邮件列表中与软件安全性相关的错误。保持与软件作者、专门从事软件安全的组织和个人的沟通,以便迅速了解和熟悉软件中安全相关故障的技术和组织细节。通过安全更新的形式提供软件安全漏洞的解决方案。以EulerOS安全公告的形式向用户通知错误和安全更新。
  • [技术干货] openEuler 22.03 LTS
    想全面的了解 openEuler 22.03 LTS,可能会发现其所承载的内容十分之多,不易抓住重点。在这里,我将我所了解到的信息,梳理之后整理给大家,以使大家可以在选型、评估和使用时有所参考。版本路线图对于不太熟悉欧拉的同学,我这里简单介绍一下欧拉之前的发展路线:2019 年 12 月 31 日,openEuler 正式宣布开源,其脱胎自华为内部基于 Linux 的积累。四个月后,openEuler 发布了第一个版本 20.03 LTS,它也是一个长期支持版本。其后,openEuler 按照半年一个版本的节奏发布了三个创新版。从创新版开始,华为之外的多个公司、团队、独立开发者参与到了 openEuler 的开发当中。在这几个创新版中,提出、融入了多个值得一提的新特性,如内核热升级、内存分级扩展、千核运算能力、业务混部 CPU 调度算法等核心能力,也从面向云计算逐步拓展到支持边缘计算、嵌入式的全场景领域。这一切,在刚刚发布的 openEuler 22.03 LTS 得到了融会贯通,将在之前的创新版中经过产品环境验证和打磨的优秀特性和创新,有机的组织起来,并形成了一个统一的基础设施基座。跨越式进步根据官方数据,我们看到,这次的 22.03 LTS 和两年前的 20.03 LTS 相比,整体来说内容丰富了许多。比如软件包数量:20.03 LTS 官方提供的软件包, 包括 ISO 镜像中的 2016 个、EPOL 仓库中的 762 个,总计 2778 个;而在 22.03 LTS 中,软件包数量达到了 ISO 4241 个、EPOL 1329 个、oepkgs 13323,总计 18893 个!达到了两年前的 6.8 倍。openEuler 软件包数量:20.03 vs 22.03不只是软件包的数量,欧拉操作系统所支持的硬件架构,也从两年前的 64 位的 ARM 和 x86 架构,又增加了两个:32 位的 ARM 架构,以及国产 CPU 申威架构。曾经连续多次取得超算 TOP500 世界排名第一的中国超算神威·太湖之光中安装的就是 40960 个申威 CPU。通过支持这些架构,欧拉操作系统就可以运行在鲲鹏、英特尔、飞腾、申威、龙芯、兆芯等主流芯片之上。而能在两年间取得这样的大跨步进展,背后是欧拉社区的“疯狂输出”。根据数据,欧拉操作系统当前已有 69891 个提交,仅 22.03 LTS 这个版本就新增了 2300 万行代码。今年以来,欧拉操作系统已经发布了 127 个安全公告,几乎平均每天发布一个。在欧拉操作系统发布以来,其已经创建了 241 个创新项目代码仓,平均每 3.5 天新增一个。而这一切,都是 773 位开发者不断努力的结果。根据欧拉发布的 数据看板),到目前为止,欧拉已经有社区用户 479990 位,其中贡献者 8515 位,单位会员 333 家;合并请求 5 万余,评审 30 万条;成立了近百个 SIG,创建了近 9 千个代码仓。“终始惟一,时乃日新”就此,我问了欧拉社区技术委员会主席胡欣蔚,“欧拉为何能做到这样大的跨越式进步?”他谦逊地表示,这只是“两年的厚积薄发”。当然,能取得这样的进展,也是在欧拉的开发和管理上,将“华为在开发和工程方面的经验”和开源运作的模式进行了结合,并得益于欧拉社区开发的一系列迁移工具。根据公开披露的信息,欧拉操作系统在政府、运营商、金融、能源、交通、互联网等行业已达到规模应用,累计部署超过了 130 万套。2022 年,预计欧拉操作系统将在行业的应用新增超过 200 万套。主要特性内核和底层改进在 openEuler 22.03 LTS 中,采用了经过长期打磨和调校的 Linux 内核 5.10 长期支持版,在这个版本中,华为向上游 Linux 内核社区提交了大量贡献。可以说,这个内核版本是华为的一个“锚定”版本。在此版本上,openEuler 融入了之前三个创新版中经过商业验证的创新特性。欧拉操作系统使用的是 Linux 内核 5.10,但除了 Linux 内核自身的特性之外,欧拉操作系统在内核中还做了十余处创新增强,主要包括用来提升性能的进程调度优化、大页内存性能优化、OOM 内存回收优化、XDP 网络性能优化等。比如它集成了一套新的 QoS 调度机制,使得在线业务可以实现抢占式优先;而 OOM 分级使得离线业务的内存可以在欧拉操作系统中得到极速的回升,这二者结合起来,就提供了对 QoS 最强有力的支撑。又比如 UC 容错使得欧拉在面对硬件可靠性问题的时候更加有力,不再需要简单粗暴的重启,而是可以通过对于具体进程的控制,来实现错误的隔离。除了这些隐蔽但重要的内核改进之外,如今在运维领域已经大量使用了非易失性内存(NVDIMM)存储介质,而传统的 Ext4 文件系统尚缺乏针对性的优化,因为 Ext4 本身是针对旋转式硬盘设计的文件系统。尤其在元数据管理方面,基于现有日志同步机制,其元数据管理开销大,且容易出现写放大问题,无法充分发挥 NVDIMM 优势。欧拉操作系统中集成的 Eulerfs 其创新的元数据软更新技术,减少了元数据同步开销,有效提升文件系统的系统调用性能。在单机应用、云原生分布式应用高性能数据存储场景,可以代替 Ext4、XFS 等文件系统。在这个版本中,还吸收了鸿蒙中的分布式软总线能力,可以实现欧拉设备之间的自发现、自联通,以及欧拉和鸿蒙设备的自发现。云计算强化针对云原生业务混合部署场景,欧拉操作系统中创新的 QAS 算法,是一种适用于云原生场景,业务混合部署的全新调度算法,可以确保在线任务对 CPU 的快速抢占,确定性的调度运行,同时压制离线任务干扰。这些改进适用于对交互类等时延敏感型业务(比如 MySQL、Redis、Nginx 等)和 CPU 消耗重且时延不敏感的业务(如 AI 离线训练)的混合部署。根据欧拉发布会现场的演示,一台服务器部署了欧拉操作系统 22.03 LTS 中的改进技术,而另一台没有。这两台服务器上,都同时运行相同的在线和离线两类业务。通过运行结果可以看到,在一台服务器上的 QPS 是 1.18,而另一台上达到了 2.62,相差了将近一倍;而时延分别是 1.53 秒和0.60 秒,相差也将近一倍。
  • [技术干货] openEuler操作系统安装
    openEuler[1] 是一个开源、免费的 Linux 发行版平台,通过开放的社区形式与全球的开发者共同构建一 个开放、 多元和架构包容的软件生态体系。同时,openEuler 也是一个创新的平台,鼓励任何人在该平台上提出新想法、开拓新思路、实践新方案。【学习目标】openEuler 原生系统的启动和安装参与贡献 openEuler【环境准备】工欲善其事,必先利其器。首先,我们需要做一些 openEuler 安装的环境准备。1. 操作系统:Windows 10 (64位)使用我们最常用的操作系统,为安装 openEuler 的相关工具提供基础运行环境。2. 虚拟机:Oracle VM VirtualBoxVirtualBox 是由 Oracle 开发的一款针对 x86 硬件的虚拟机,为 openEuler 提供了安装、运行、配置等环境。在 VirtualBox 官网 [2] 下载 Windows 版本 的 VirtualBox,本文主要以 6.1.12 platform 为例来介绍 openEuler 的安装过程。3. openEuler 镜像:openEuler-20.03-LTS-x86_64-dvd.isoopenEuler 镜像提供了完整的 openEuler ,目前架构支持 X86_64 和 aarch64。在 openEuler 开源社区获取 openEuler 镜像 repo 源 [3],选择 openEuler-20.03-LTS-x86_64-dvd.iso[4] 下载。【安装体验】万事俱备,只欠东风。在环境和工具准备完毕后,我们就可以进入正题 ——openEuler 的安装。1. openEuler 的安装模式openEuler 提供了 2 种安装模式,以应对不同的场景需求:文本模式:适用于服务器场景。图形模式:适用于服务器和 PC 场景,有一定的软硬件约束,需要提供显卡和图形驱动的支持。接下来,将主要介绍在图形模式下安装 openEuler 的过程。在此之前,我们需要先安装 Virtual Box 虚拟机,来运行 openEuler 所需的安装环境。2. Virtual Box VM 安装\1) 建立 openEuler 的启动项打开下载完成的 Oracle VM VirtualBox,新建 openEuler 启动环境。在 工具 选项卡中,点击 新建 按钮,选择新建虚拟电脑;设置 openEuler 名称、VM 目录及 Windows 版本,由于系统版本默认是 Windows 7,我们需要手动选择 Windows 10(64-bit)。\2) 分配内存VirtualBox 会视当前设备的配置而自动建议分配内存大小,一般使用建议的内存分配大小,后面也可以根据实际使用情况来手动调整。\3) 新建虚拟硬盘勾选 现在创建虚拟硬盘选项来新建虚拟硬盘,文件类型选择 VDI(VirtualBox 磁盘映像);分配模式选择 动态分配;文件位置和大小选择默认即可。openEuler 启动环境新建完成后,还需要对虚拟机的启动项进行一些基本的设置。\4) 基本设置存储:引用 openEuler 的 ISO 镜像。系统 - 主板 - 启动顺序:确保第一顺序设置为 光驱 ,防止引用到硬盘上其他 ISO。到这里,Virtual Box 虚拟机环境和 openEuler 启动项的设置基本完成,部分偏好设置可根据自身的情况进行调整,点击右侧的启动按钮,就可以进入 openEuler 的安装阶段。3. openEuler 安装\1) 选择启动盘点击文件夹图标,注册/新建一个 ISO 镜像引用,然后选择下载好的 openEuler ISO 镜像,点击启动。\2) 安装 openEuler 20.03-LTS选择 Install openEuler 20.03-LTS,按下回车键进行安装。其中,Test media 是用来进行文件完整性校验,防止 ISO 文件内容的缺失,通常情况下,选择直接安装即可。首先来到 openEuler 欢迎界面,这里的语言选择指的是安装过程中的语言环境,选择简体中文的语言环境,点击继续。然后进入安装信息摘要界面,针对 OS 环境进行一些配置:本地化:语言代表着安装完成后的 OS 语言环境;时间和日期代表着时区,默认是上海。软件:安装源代表着光驱内的我们下载的 ISO 镜像,可以作为自动安装介质使用;软件选择代表着当前环境附加的功能,一般我们选择默认的最小安装,来保证拥有基本的核心功能。系统:安装位置代表着 openEuler 的安装磁盘对应位置,确认好磁盘,点击完成将自动分区;网络和主机名代表着网络的连接,我们需要确保以太网处于连接状态。安装信息确认后,我们点击开始安装,可以看到 openEuler 的安装进度。在等待安装时,我们还能够设置 Root 密码,将在后续的系统登录中使用到,密码规范需要三种以上的字符类型,设置完毕后点击完成,当看到界面中的红色警告消失,说明密码设置成功。在安装完成之后,需要重新启动系统。我们关闭电源,依次打开启动项 - 设置 - 系统 - 主板 - 启动顺序,将硬盘提升到第一启动顺序,同时也可以删除 ISO 镜像引用。再次启动系统,在短暂的进程等待后,输入 Root 密码,我们就可以进入并使用 openEuler 了。由此可见,openEuler 的图形模式安装简单快速,易于上手。4. openEuler 的启动流程学习了 openEuler 的安装,我们再了解一下 openEuler 的启动模式和流程。针对不同的架构,openEuler 提供的启动模式也不同。X86 架构包含 Legacy 和 UEFI 模式,而 ARM 架构目前只包含 UEFI 模式。上文中的安装启动流程,就是采用的 Legacy 模式。经 BootLoader 最终到硬盘引导的 GURB2, GURB2 引导内核 Kernel - initrd - systemd 进程,最后启动 openEuler 社区目前维护的程序 ANACONDA。5. openEuler 自动化安装除了图形安装模式,openEuler 社区还提供了文本模式的 自动化安装,以及各类虚拟机配置,方便 DIY 爱好者使用。openEuler 支持 pxe 自动化安装部署,具体流程如下图所示,环境除了物理 / 虚拟机和 ISO 镜像外,还需要用来存放 kickstart 文件 的 httpd 和 提供 vmlinuz 与 initrd 文件的 tftp 服务器,以及 kickstart 的自定义安装配置。\1) 安装之前,需要确保 http 服务器的防火墙处于关闭状态,使用防火墙关闭指令:iptables -F\2) httpd 的安装与服务启动# dnf install httpd -y# systemctl start httpd# systemctl enable httpd\3) tftp 的安装与配置# dnf install tftp-server -y# vim /etc/xinetd.d/tftpservice tftp{socket_type = dgramprotocol = udpwait = yesuser = rootserver = /usr/sbin/in.tftpdserver_args = -s /var/lib/tftpbootdisable = noper_source = 11cps = 100 2flags = IPv4}# systemctl start tftp# systemctl enable tftp# systemctl start xinetd# systemctl status xinetd# systemctl enable xinetd\4) 安装源的制作# mount openEuler-20.03-LTS-aarch64-dvd.iso /mnt# cp -r /mnt/* /var/www/html/openEuler/\5) openEuler-ks.cfg 的设置和修改,kickstart 配置文件可根据实际需求进行额外的更改#vim /var/www/html/ks/openEuler-ks.cfg====================================***以下内容根据实际需求进行修改***#version=DEVELignoredisk --only-use=sdaautopart --type=lvm# Partition clearing informationclearpart --none --initlabel# Use graphical installgraphical# Keyboard layoutskeyboard --vckeymap=cn --xlayouts='cn'# System languagelang zh_CN.UTF-8#Use http installation sourceurl --url=//192.168.122.1/openEuler/%post#enable kdumpsed -i "s/ ro / ro crashkernel=1024M,high /" /boot/efi/EFI/openEuler/grub.cfg%end...6)kickstart 自定义安装配置a. 获取 ks 配置文件手动安装完成之后,在 /root 目录下会自动生成 anaconda-ks.cfg 文件b. 指定 ks 文件启动参数添加:inst.ks=[http|ftp|nfs]://path\7) 修改 pxe 配置文件 grub.cfg,以下配置内容可供参考# cp -r /mnt/images/pxeboot/* /var/lib/tftpboot/# cp /mnt/EFI/BOOT/grubaa64.efi /var/lib/tftpboot/# cp /mnt/EFI/BOOT/grub.cfg /var/lib/tftpboot/# ls /var/lib/tftpboot/grubaa64.efi grub.cfg initrd.img TRANS.TBL vmlinuz# vim /var/lib/tftpboot/grub.cfgset default="1" function load_video { if [ x$feature_all_video_module = xy ]; then insmod all_video else insmod efi_gop insmod efi_uga insmod ieee1275_fb insmod vbe insmod vga insmod video_bochs insmod video_cirrus fi} load_videoset gfxpayload=keepinsmod gzioinsmod part_gptinsmod ext2 set timeout=60 ### BEGIN /etc/grub.d/10_linux ###menuentry 'Install openEuler 20.03 LTS' --class red --class gnu-linux --class gnu --class os { set root=(tftp,192.168.1.1) linux /vmlinuz ro inst.geoloc=0 console=ttyAMA0 console=tty0 rd.iscsi.waitnet=0 inst.ks=http://192.168.122.1/ks/openEuler-ks.cfg initrd /initrd.img}\8) DHCP 的配置(可以使用 dnsmasq 代替 )# dnf install dhcp -y## DHCP Server Configuration file.# see /usr/share/doc/dhcp-server/dhcpd.conf.example# see dhcpd.conf(5) man page## vim /etc/dhcp/dhcpd.confddns-update-style interim;ignore client-updates;filename "grubaa64.efi";    # pxelinux 启动文件位置;next-server 192.168.122.1;  # (重要)TFTP Server 的IP地址;subnet 192.168.122.0 netmask 255.255.255.0 {option routers 192.168.111.1; # 网关地址option subnet-mask 255.255.255.0; # 子网掩码range dynamic-bootp 192.168.122.50 192.168.122.200; # 动态ip范围default-lease-time 21600;max-lease-time 43200;}# systemctl start dhcpd# systemctl enable dhcpd\9) 在 Start boot option 界面按下 F2 选择从网络 pxe 启动,开始自动化安装openEuler 提供的文本模式下 pxe 自动化安装,充分满足了 DIY 爱好者的需求,同时还提供了简易快速,便于上手的图形安装模式,以此来面向不同场景和人群。在了解 openEuler 安装、启动流程后,跟着文中的步骤,一起来体验开放多元的 openEuler!【参与贡献 openEuler】1. 关于 openEuleropenEuler 的愿景:通过社区合作,打造创新平台,构建支持多处理器架构、统一和开放的操作系统 openEuler,推动软硬件生态繁荣发展。目前 openEuler 正处于升级 SIG 的阶段,对以下模块感兴趣的朋友可以一起参与进来:anaconda/lorax/pykickstart/python-blivetgrub2/syslinuxyum/dnf也可以在码云 gitee 的 openEuler 社区 [5] 中贡献力量:Fork the projectCheckout the branchCommit your codePull request参考资料
  • [技术干货] 欧拉操作系统
    “欧拉+鸿蒙”是华为着力打造的两个系统,是华为的“铸魂”工程。鸿蒙服务于智能终端、物联网和工业终端。欧拉不仅服务鲲鹏,也支持X86、定位于面向服务器、边缘计算、云、嵌入式设备等领域的操作系统,2019年,华为把自己在服务器操作系统上积累了10余年的能力开放出来,欧拉操作系统正式开源。2021年11月,华为宣布捐赠欧拉系统,将全量代码等捐赠给开放原子开源基金会。2022年4月15日,欧拉捐赠后首个社区共建版本openEuler 22.03 LTS正式发布,这也是首个支持数字基础设施全场景的长周期版本,同时已有8家欧拉生态伙伴宣布即将推出基于openEuler 22.03 LTS的商业发行版。欧拉在政府、运营商、金融、能源、交通、互联网等行业已规模应用,累计超过130万套。2022年,欧拉在行业应用将新增200万套,未来,将有更快的增长和突破。01欧拉操作系统概述欧拉操作系统(openEuler,简称“欧拉”)是面向数字基础设施的操作系统,支持服务器、云计算、边缘计算、嵌入式等四大应用场景,支持多样性计算,致力于提供安全、稳定、易用的操作系统。欧拉作为一个操作系统发行版平台,每两年推出一个LTS版本。该版本为企业级用户提供了一个安全稳定可靠的操作系统。欧拉也是一个技术孵化器。通过每半年发布一次的创新版,快速集成openEuler以及其他社区的最新技术成果,将社区验证成熟的特性逐步汇合到发行版中。这些新特性以单个开源项目的方式存在于社区,方便开发者获得源代码,也方便其他开源社区使用。根据《中国服务器操作系统市场研究报告》,2021年欧拉在政府、运营商行业实现新增市场份额第一,在金融行业市场增速第一。02欧拉产业链欧拉产业链包括欧拉共建者和欧拉下游厂商。欧拉共建者包括处理器多样算力厂商、操作系统厂商、行业ISV厂商等,下游应用厂商包括运营商、金融、政府等主体。欧拉发展迅速,下游应用广泛,产业供应链具有较强的安全性。截至目前,欧拉开源社区已经汇聚了330多家企业伙伴,包括芯片厂商、整机厂商、操作系统厂商、应用软件厂商等,吸引近万名开发者,成立近百个特别兴趣小组,全球下载量超过47万,PR合入超过5.5万。支持主流的芯片厂商包括Avago、Emulex、Intel、鲲鹏、龙芯、Mellanox、NVIDIA、飞腾、Qlogic、树莓派、RISC-V、兆芯、申威等;整机厂商包括百信、新华三、湘江鲲鹏、四川虹信、黄河科技、联想、宝德、曙光、清华同方、长江计算、超聚变、神州云科等。共建厂商:OSV厂商,麒麟信安、中科创达等;ISV厂商,润和软件、青云信息、拓维信息、东方通、创意信息、软通动力等;芯片厂商,龙芯中科等。随着openEuler 22.03 LTS版本的发布,麒麟软件、统信软件、麒麟信安、SUSE、超聚变、新华三、$中科创达(SZ300496)$ 、科东软件等伙伴,也宣布即将推出基于openEuler 22.03 LTS的商业发行版,将社区创新成果应用到各行各业,转化为数字经济发展的原动力。03欧拉四大场景的不同镜像创新针对4大场景提供不同系统镜像,做到统一内核、统一构建、统一SDK、统一联接和统一开发工具。1.服务器场景openEuler22.03LTSServer新文件系统EulerFS:面向非易失性内存的新文件系统,采用软更新、目录双视图等技术减少文件元数据同步时间,提升文件读写性能。内存分级扩展etMem:新增用户态swap功能,策略配置淘汰的冷内存交换到用户态存储,用户无感知,性能优于内核态swap。内存RAS增强:内存可靠性分级技术,可以指定内核、关键进程等对内存故障敏感的数据优先使用高可靠内存,降低宕机率,提升可靠性(技术预览特性)。2.云计算场景openEuler22.03LTSCloud容器操作系统KubeOS:云原生场景,实现OS容器化部署、运维,提供与业务容器一致的基于K8s的管理体验。安全容器方案:iSulad+shimv2+StratoVirt安全容器方案,相比传统Docker+Qemu方案,底噪和启动时间优化40%。双平面部署工具eggo:ARM/x86双平面混合集群OS高效一键式安装,百节点部署时间<15min。3.边缘计算场景openEuler22.03LTSEdge提供统一的跨边云的协同框架(KubeEdge+),实现边云之间的应用管理与部署,跨边云的通信,以及跨边云的南向外设管理等基础能力。可应用智能制造、城市交通、高速收费稽查、智慧加油站、医疗影像识别、智慧园区等广泛的边云协同场景。4.嵌入式场景openEuler22.03LTSEmbedded轻量化能力:开放yocto小型化构建裁剪框架,支撑OS镜像轻量化定制,提供OS镜像<5M,以及<5S快速启动等能力。多硬件支持:新增支持树莓派作为嵌入式场景通用硬件。软实时内核:基于Linux5.10内核提供软实时能力,软实时中断响应时延微秒级。混合关键性部署:实现SOC内实时和非实时多平面混合部署,并支持Zephyr实时内核。分布式软总线基础能力:集成鸿蒙的分布式软总线,实现欧拉嵌入式设备之间互联互通。嵌入式软件包支持:新增80+嵌入式领域常用软件包的构建。嵌入式系统可广泛应用于航空航天、工业控制、电信设备、汽车及医疗等领域;随着5G、AI新型技术的成熟,还可应用于物联网IoT设备,边缘智能计算设备等。目前欧拉已成为数字基础设施的开源操作系统,支持多样性设备且覆盖全场景应用。而欧拉与鸿蒙在能力和生态进一步打通后形成互补,可以更充分地服务数字全场景。承诺不做欧拉商业发行版的华为未来将不遗余力地携手助力合作伙伴,在商业推广与开源建设方面一同走向全球市场作者:红旗招展666 链接:cid:link_0 来源:雪球 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 风险提示:本文所提到的观点仅代表个人的意见,所涉及标的不作推荐,据此买卖,风险自负。
  • [技术干货] 欧拉版本关键特性集成Kubernetes 1.20
    下载地址:cid:link_3 最新版ISO下载地址:cid:link_0 文档地址:cid:link_521.03 版本关键特性集成Kubernetes 1.20用于自动部署,扩展和管理容器化应用程序的云原生操作系统它更多特性,请参考Kubernetes 1.20官方发行说明。自动上线和回滚,Kubernetes 会自动将应用或其配置的更改后的实例上线,同时监视应用程序运行状况,失败就会回滚之前所作更改。 服务发现和负载均衡,服务发现和基于容器IP和DNS名称的负载均衡机支持。 存储编排,支持多种存储后端的自动挂载,如本地存储、NFS、iSCSI、Gluster、Ceph等网络存储系统。 水平扩展,支持命令行、UI手动操作扩展,以及基于 CPU 使用情况自动扩展方式。参考文章连接:cid:link_1一、安装及配置安装操作系统的过程省略…以下操作在主节点上完成:安装软件:[root@openeuler ~]# dnf install -y kubernetes-kubeadm kubernetes-kubelet kubernetes-master启动kubelet服务:[root@openeuler ~]# swapoff -a [root@openeuler ~]# systemctl stop firewalld && systemctl disable firewalld [root@openeuler ~]# systemctl enable docker && systemctl start docker [root@openeuler ~]# systemctl enable kubelet.service && systemctl start kubelet.service初始化主节点:[root@openeuler ~]# kubeadm init --apiserver-advertise-address=192.168.128.132 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.2 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16 [init] Using Kubernetes version: v1.20.2 [preflight] Running pre-flight checks [WARNING Firewalld]: firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/ [WARNING Hostname]: hostname "openeuler" could not be reached [WARNING Hostname]: hostname "openeuler": lookup openeuler on 192.168.128.2:53: server misbehaving [preflight] Pulling images required for setting up a Kubernetes cluster [preflight] This might take a minute or two, depending on the speed of your internet connection [preflight] You can also perform this action in beforehand using 'kubeadm config images pull' [certs] Using certificateDir folder "/etc/kubernetes/pki" [certs] Generating "ca" certificate and key [certs] Generating "apiserver" certificate and key [certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local openeuler] and IPs [10.1.0.1 192.168.128.132] [certs] Generating "apiserver-kubelet-client" certificate and key [certs] Generating "front-proxy-ca" certificate and key [certs] Generating "front-proxy-client" certificate and key [certs] Generating "etcd/ca" certificate and key [certs] Generating "etcd/server" certificate and key [certs] etcd/server serving cert is signed for DNS names [localhost openeuler] and IPs [192.168.128.132 127.0.0.1 ::1] [certs] Generating "etcd/peer" certificate and key [certs] etcd/peer serving cert is signed for DNS names [localhost openeuler] and IPs [192.168.128.132 127.0.0.1 ::1] [certs] Generating "etcd/healthcheck-client" certificate and key [certs] Generating "apiserver-etcd-client" certificate and key [certs] Generating "sa" key and public key [kubeconfig] Using kubeconfig folder "/etc/kubernetes" [kubeconfig] Writing "admin.conf" kubeconfig file [kubeconfig] Writing "kubelet.conf" kubeconfig file [kubeconfig] Writing "controller-manager.conf" kubeconfig file [kubeconfig] Writing "scheduler.conf" kubeconfig file [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Starting the kubelet [control-plane] Using manifest folder "/etc/kubernetes/manifests" [control-plane] Creating static Pod manifest for "kube-apiserver" [control-plane] Creating static Pod manifest for "kube-controller-manager" [control-plane] Creating static Pod manifest for "kube-scheduler" [etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests" [wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s [apiclient] All control plane components are healthy after 9.002950 seconds [upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace [kubelet] Creating a ConfigMap "kubelet-config-1.20" in namespace kube-system with the configuration for the kubelets in the cluster [upload-certs] Skipping phase. Please see --upload-certs [mark-control-plane] Marking the node openeuler as control-plane by adding the labels "node-role.kubernetes.io/master=''" and "node-role.kubernetes.io/control-plane='' (deprecated)" [mark-control-plane] Marking the node openeuler as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule] [bootstrap-token] Using token: gnvwps.ydjc5gxisxxvztua [bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles [bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes [bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials [bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token [bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster [bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace [kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key [addons] Applied essential addon: CoreDNS [addons] Applied essential addon: kube-proxy Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.128.132:6443 --token gnvwps.ydjc5gxisxxvztua \ --discovery-token-ca-cert-hash sha256:adc61edc9452c6c44abaf9f62b976ec8c9109d2635c234c0a212e0f2f0381026创建普通用户kubeuser:[root@openeuler ~]# groupadd kubeuser [root@openeuler ~]# useradd -d /home/kubeuser -m -g kubeuser kubeuser [root@openeuler ~]# passwd kubeuser Changing password for user kubeuser. (pass:kubepass)添加sudo权限 /etc/sudoers%kubeuser ALL=(ALL) ALL su - kubeuser执行以下命令 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc查看master状态:export KUBECONFIG=/etc/kubernetes/admin.conf [kubeuser@openeuler ~]$ kubectl get nodes NAME STATUS ROLES AGE VERSION openeuler NotReady control-plane,master 4h34m v1.20.2查看kubelet服务状态:[root@k8sslave1 ~]# journalctl -u kubelet -f Sep 16 14:07:21 k8sslave1 kubelet[8548]: : [failed to find plugin "flannel" in path [/opt/cni/bin] failed to find plugin "portmap" in path [/opt/cni/bin]] Sep 16 14:07:21 k8sslave1 kubelet[8548]: W0916 14:07:21.033280 8548 cni.go:239] Unable to update cni config: no valid networks found in /etc/cni/net.d Sep 16 14:07:22 k8sslave1 kubelet[8548]: E0916 14:07:22.858257 8548 kubelet.go:2163] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized解决方法:[root@k8sslave2 ~]# dnf install -y containernetworking-plugins containernetworking-plugins-devel Last metadata expiration check: 0:06:18 ago on Thu 16 Sep 2021 01:49:56 PM CST. Dependencies resolved. ============================================================================================================================================================================== Package Architecture Version Repository Size ============================================================================================================================================================================== Installing: containernetworking-plugins x86_64 0.8.2-4.git485be65.oe1 OS 17 M containernetworking-plugins-devel noarch 0.8.2-4.git485be65.oe1 everything 84 k Transaction Summary ============================================================================================================================================================================== Install 2 Packages [root@openeuler ~]# mkdir -p /opt/cni/bin [root@openeuler ~]# cp /usr/libexec/cni/* /opt/cni/bin/ [root@openeuler ~]# systemctl restart kubelet 以下是在slave节点上执行:安装软件:[root@k8sslave2 ~]# dnf install -y kubernetes-kubeadm kubernetes-kubelet kubernetes-node containernetworking-plugins containernetworking-plugins-devel启动kubelet服务:[root@k8sslave2 ~]# mkdir -p /opt/cni/bin [root@k8sslave2 ~]# cp /usr/libexec/cni/* /opt/cni/bin/ [root@k8sslave2 ~]# swapoff -a [root@k8sslave2 ~]# systemctl stop firewalld && systemctl disable firewalld [root@k8sslave2 ~]# systemctl enable docker && systemctl start docker [root@k8sslave2 ~]# systemctl enable kubelet.service && systemctl start kubelet.service [root@k8sslave2 ~]# kubeadm join 192.168.128.132:6443 --token gnvwps.ydjc5gxisxxvztua \ --discovery-token-ca-cert-hash sha256:adc61edc9452c6c44abaf9f62b976ec8c9109d2635c234c0a212e0f2f0381026在主节点查看所有节点状态:(如下状态均为Ready表示节点安装正常)[kubeuser@openeuler ~]$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8sslave2 Ready <none> 137m v1.20.2 openeuler Ready control-plane,master 4h51m v1.20.2二、部署应用部署应用的关键是打通网络, 参考文章:cid:link_2引用一段介绍如下: k8s要靠CNI接口接入其他插件来实现网络通讯。目前比较流行的插件有flannet,callco,canel,kube-router。 这些插件使用的解决方案都如下: 1)虚拟网桥,虚拟网卡,多个容器共用一个虚拟网卡进行通信; 2)多路复用:MacVLAN,多个容器共用一个物理网卡进行通信; 3)硬件交换:SR-LOV,一个物理网卡可以虚拟出多个接口,这个性能最好。 本例使用flannet网络插件,其他插件不在本文讨论范围: 修改docker镜像(所有节点安装)[root@openeuler ~]# vi /etc/docker/deamon.json { "registry-mirrors": ["http://hub-mirror.c.163.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn"] } [root@openeuler ~]# docker pull lizhenliang/flannel:v0.11.0-amd64也可以使用配置文件来完成安装: 配置文件下载连接:cid:link_4[kubeuser@openeuler ~]$ kubectl apply -f kube-flannel.yml在主节点上部署nginx[kubeuser@openeuler ~]$ kubectl create deployment nginx --image=nginx [kubeuser@openeuler ~]$ kubectl expose deployment nginx --port=80 --type=NodePort [kubeuser@openeuler ~]$ kubectl get pod,svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 5h4m service/nginx NodePort 10.1.106.205 <none> 80:32108/TCP 131m [kubeuser@openeuler ~]$ kubectl scale deployment nginx --replicas=3 [kubeuser@openeuler ~]$ kubectl get pod,svc NAME READY STATUS RESTARTS AGE pod/nginx-6799fc88d8-q56d8 1/1 Running 0 119m pod/nginx-6799fc88d8-sntzg 1/1 Running 0 106m pod/nginx-6799fc88d8-zf4kr 1/1 Running 0 106m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 5h4m service/nginx NodePort 10.1.106.205 <none> 80:32108/TCP 131m分别访问主节点和从节点的32108端口即可访问到nginx集群。
  • [技术干货] 离线部署k8s集群
    离线部署k8s集群集群配置CPU鲲鹏920系统openEuler 22.03 LTS aarch64master-ip192.168.1.111node1-ip192.168.1.112node2-ip192.168.1.113k8s1.23.6docker19.03.11路径规划vim/opt/vimtar/opt/tarntpd/opt/ntpdsocat/opt/socatconntrack/opt/conntrackdocker/opt/dockerimages/opt/imageskubectl/kubeadm/kubelet/opt/k8scni/opt/cnicritest/opt/critestcalico/opt/calicodashboard/opt/dashboard准备离线包rpm包vimyum install -y --downloadonly --downloaddir=/opt/vim vimtaryum install -y --downloadonly --downloaddir=/opt/tar tarntpdyum install -y --downloadonly --downloaddir=/opt/ntpd ntpdsocatyum install -y --downloadonly --downloaddir=/opt/socat socatconntrackyum install -y --downloadonly --downloaddir=/opt/conntrack conntrack二进制包dockercd /opt/docker && wget https://download.docker.com/linux/static/stable/aarch64/docker-19.03.11.tgzkubectl/kubeadm/kubeletcd /opt/k8s curl -LO https://dl.k8s.io/release/v1.23.6/bin/linux/arm64/kubectl curl -LO https://dl.k8s.io/release/v1.23.6/bin/linux/arm64/kubeadm curl -LO https://dl.k8s.io/release/v1.23.6/bin/linux/arm64/kubeletcnicd /opt/cni && wget https://github.com/containernetworking/plugins/releases/download/v0.9.1/cni-plugins-linux-arm64-v0.9.1.tgzcritestcd /opt/critest && wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.22.0/critest-v1.22.0-linux-arm64.tar.gzetcdcd /opt/etcd && wget https://github.com/etcd-io/etcd/releases/download/v3.5.5/etcd-v3.5.5-linux-arm64.tar.gzdocker镜像控制平面镜像kubeadm config images list kubeadm config images pullcalico镜像cd /opt/calico && curl https://docs.projectcalico.org/manifests/calico.yaml -O cat calico.yaml \ | grep image: \ | awk '{print "docker pull " $2}' \ | shdashboard镜像docker pull kubernetesui/dashboard:v2.5.1 docker pull kubernetesui/metrics-scraper:v1.0.7导出docker save -o /opt/images/k8s.gcr.io.kube-apiserver.v1.23.6.tar k8s.gcr.io/kube-apiserver:v1.23.6 docker save -o /opt/images/k8s.gcr.io.kube-proxy.v1.23.6.tar k8s.gcr.io/kube-proxy:v1.23.6 docker save -o /opt/images/k8s.gcr.io.kube-controller-manager.v1.23.6.tar k8s.gcr.io/kube-controller-manager:v1.23.6 docker save -o /opt/images/k8s.gcr.io.kube-scheduler.v1.23.6.tar k8s.gcr.io/kube-scheduler:v1.23.6 docker save -o /opt/images/k8s.gcr.io.etcd.v3.5.1-0.tar k8s.gcr.io/etcd:3.5.1-0 docker save -o /opt/images/k8s.gcr.io.coredns.coredns.v1.8.6.tar k8s.gcr.io/coredns/coredns:v1.8.6 docker save -o /opt/images/k8s.gcr.io.pause.v3.6.tar k8s.gcr.io/pause:3.6 docker save -o /opt/images/calico.kube-controllers.v3.24.5.tar calico/kube-controllers:v3.24.5 docker save -o /opt/images/calico.cni-v3.24.5.tar calico/cni:v3.24.5 docker save -o /opt/images/calico.node-v3.24.5.tar calico/node:v3.24.5 docker save -o /opt/images/dashboard.tar kubernetesui/dashboard:v2.5.1 docker save -o /opt/images/metrics-scraper.tar kubernetesui/metrics-scraper:v1.0.7配置文件dashboard.ymlcd /opt/dashboard && wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml -O dashboard-v2.5.1.yaml上传离线包master/node上传scp/ftp等rpmrpm -ivh *.rpmdocker镜像docker load -i /opt/images/k8s.gcr.io.kube-apiserver.v1.23.6.tar docker load -i /opt/images/k8s.gcr.io.kube-controller-manager.v1.23.6.tar docker load -i /opt/images/k8s.gcr.io.kube-proxy.v1.23.6.tar docker load -i /opt/images/k8s.gcr.io.kube-scheduler.v1.23.6.tar docker load -i /opt/images/k8s.gcr.io.coredns.coredns.v1.8.6.tar docker load -i /opt/images/k8s.gcr.io.etcd.v3.5.1-0.tar docker load -i /opt/images/k8s.gcr.io.pause.v3.6.tar docker load -i /opt/images/calico.kube-controllers.v3.24.5.tar docker load -i /opt/images/calico.cni-v3.24.5.tar docker load -i /opt/images/calico.node-v3.24.5.tar docker load -i /opt/images/dashboard.tar docker load -i /opt/images/metrics-scraper.tarhostnamemaster设置hostnamectl set-hostname masternode1设置hostnamectl set-hostname node1node2设置hostnamectl set-hostname node2hostsmaster/node设置cat >> /etc/hosts << EOF 192.168.1.111 master 192.168.1.112 node1 192.168.1.113 node2 EOF免密master生成密钥ssh-keygen t rsa将密钥分发给nodessh-copy-id node1 ssh-copy-id node2防火墙master/node关闭防火墙systemctl stop firewalld取消开机自启动防火墙systemctl disable firewalld查看防火墙状态systemctl status firewalldSELinuxmaster/node临时关闭SELinuxsetenforce 0 永久关闭SELinuxsed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux查看SELinux状态getenforceSwapmaster/node临时关闭Swapswapoff -a永久关闭Swapsed -ri 's/.*swap.*/#&/' /etc/fstab 查看SELinux状态free将桥接的 IPv4 流量传递到 iptables 的链master/node设置modprobe br_netfilter lsmod | grep br_netfilter touch /etc/resolv.conf cat <<EOF | tee /etc/modules-load.d/k8s.conf br_netfilter EOF cat <<EOF | tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system查看配置cat /etc/sysctl.conf若有内容,替换原有内容sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g" /etc/sysctl.conf sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g" /etc/sysctl.conf sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g" /etc/sysctl.conf sed -i "s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g" /etc/sysctl.conf sed -i "s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g" /etc/sysctl.conf sed -i "s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g" /etc/sysctl.conf sed -i "s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g" /etc/sysctl.conf若无内容,向其追加echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf使其生效sysctl -p时间同步master/node自启动ntpdsystemctl enable ntpdmaster修改配置cat >> /etc/ntp.conf << EOF # 允许局域网网段内所有client连接到这台服务器同步时间.但是拒绝让他们修改服务器上的时间和远程登录 restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap # 指定ntp服务器的地址 # 将当前主机作为时间服务器 server 127.127.1.0 # 时间服务器层级 0-15 0表示顶级 10通常用于给局域网主机提供时间服务 fudge 127.127.1.0 stratum 10 EOF重启systemctl restart ntpdnode修改配置cat >> /etc/ntp.conf << EOF server 192.168.1.111 profer EOF重启systemctl restart ntpd手动同步时间ntpdate -u 192.168.1.111自动同步时间 crontab -e*/5 * * * * /usr/sbin/ntpdate -u 192.168.1.111 >/dev/null 2>&1重启crond服务systemctl restart crond验证ntpq -pdockermaster/node解压cd /opt/docker && tar -zxf docker-19.03.11.tgz cp docker/* /usr/bin/创建docker.servicecat <<EOF | tee /usr/lib/systemd/system/docker.service [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not support the cgroup feature set required # for containers run by docker # 开启远程连接 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock ExecReload=/bin/kill -s HUP $MAINPID # Having non-zero Limit*s causes performance problems due to accounting overhead # in the kernel. We recommend using cgroups to do container-local accounting. LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity # Uncomment TasksMax if your systemd version supports it. # Only systemd 226 and above support this version. #TasksMax=infinity TimeoutStartSec=0 # set delegate yes so that systemd does not reset the cgroups of docker containers Delegate=yes # kill only the docker process, not all processes in the cgroup KillMode=process # restart the docker process if it exits prematurely Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target EOF配置 cgroup 驱动程序cat <<EOF | tee /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"] } EOF启动并设置开启自启systemctl daemon-reload systemctl enable docker systemctl start dockercnimaster/node解压cd /opt/cni && tar -zxf cni-plugins-linux-arm64-v0.9.1.tgz -C /usr/bincritestmaster/node解压cd /opt/critest && tar -zxf critest-v1.22.0-linux-arm64.tar.gz -C /usr/bin bashk8smaster/node赋予可执行权限cd /opt/k8s && chmod +x ./* && cp ./* /usr/bin/kubelet系统服务cat <<EOF | tee /etc/systemd/system/kubelet.service [Unit] Description=kubelet: The Kubernetes Node Agent Documentation=https://kubernetes.io/docs/ Wants=network-online.target After=network-online.target [Service] ExecStart=/usr/bin/kubelet Restart=always StartLimitInterval=0 RestartSec=10 [Install] WantedBy=multi-user.targetkubeadm配置文件mkdir -p /etc/systemd/system/kubelet.service.d cat <<EOF | tee /etc/systemd/system/kubelet.service.d/10-kubeadm.conf [Service] Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml" EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env EnvironmentFile=-/etc/sysconfig/kubelet ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS EOF自启动kubeletsystemctl enable --now kubeletmaster集群初始化kubeadm init \ --apiserver-advertise-address=192.168.1.111 \ --kubernetes-version v1.23.6 \ --service-cidr=10.96.0.0/16 \ --pod-network-cidr=192.168.0.0/16复制文件夹mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config设置环境变量sed -i '$a # kubeconfig\nexport KUBECONFIG=/etc/kubernetes/admin.conf' /etc/profile && source /etc/profilenode复制文件夹mkdir -p $HOME/.kube cp -i /etc/kubernetes/kubelet.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config设置环境变量sed -i '$a # kubeconfig\nexport KUBECONFIG=/etc/kubernetes/kubelet.conf' /etc/profile && source /etc/profilemaster部署一个pod网络(calico)kubectl apply -f calico.yaml kubectl get pods -Anode加入集群(以终端输出为准,不可复制)Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.4.45:6443 --token jokbeq.logz5fixljdrna6r \ --discovery-token-ca-cert-hash sha256:16ba5133d2ca72714c4a7dd864a5906baa427dc53d8eb7cf6d890388300a052a # token过期怎么办 kubeadm token create --print-join-command kubeadm join 192.168.4.45:6443 --token l7smzu.ujy68m80prq526nh --discovery-token-ca-cert-hash sha256:16ba5133d2ca72714c4a7dd864a5906baa427dc53d8eb7cf6d890388300a052a master验证节点纳管kubectl get nodes给节点打标签kubectl label node node1 node-role.kubernetes.io/worker='' kubectl label node node2 node-role.kubernetes.io/worker=''dashboard部署master修改dashboard-v2.5.1.yaml文件:kubernetes-dashboard的Service,目标行前后如下(更改处见注释)--- kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: ports: - port: 443 targetPort: 8443 nodePort: 30001 # 新增 nodePort: 30001 向外暴露端口 selector: k8s-app: kubernetes-dashboard type: NodePort # 新增 type: NodePort 暴露到外部访问 ---修改dashboard-v2.5.1.yaml文件:kubernetes-dashboard的Deployment,目标行前后如下(更改处见注释)kind: Deployment apiVersion: apps/v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: k8s-app: kubernetes-dashboard template: metadata: labels: k8s-app: kubernetes-dashboard spec: securityContext: seccompProfile: type: RuntimeDefault containers: - name: kubernetes-dashboard image: kubernetesui/dashboard:v2.5.1 imagePullPolicy: Never # 修改 imagePullPolicy: Never 从本地拉取镜像 ports: - containerPort: 8443 protocol: TCP修改dashboard-v2.5.1.yaml文件:dashboard-metrics-scraper的Deployment,目标行前后如下(更改处见注释)apiVersion: apps/v1 metadata: labels: k8s-app: dashboard-metrics-scraper name: dashboard-metrics-scraper namespace: kubernetes-dashboard spec: replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: k8s-app: dashboard-metrics-scraper template: metadata: labels: k8s-app: dashboard-metrics-scraper spec: securityContext: seccompProfile: type: RuntimeDefault containers: - name: dashboard-metrics-scraper image: kubernetesui/metrics-scraper:v1.0.7 imagePullPolicy: Never # 新增 imagePullPolicy: Never 从本地拉取镜像 ports: - containerPort: 8000 protocol: TCP livenessProbe: httpGet: scheme: HTTP path: / port: 8000 initialDelaySeconds: 30 timeoutSeconds: 30 volumeMounts: - mountPath: /tmp创建 dashboard 相关的 namespace/service/deployment/pod等kubectl apply -f dashboard-v2.5.1.yaml 个人PC浏览器访问 kubernetes-dashboard地址https://192.168.1.111:30001master创建 ServiceAccount 并绑定默认 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}')参考链接官方社区-openEuler搭建k8s集群openEuler搭建k8s集群集群内网时间同步离线搭建k8s集群
  • [技术干货] Shell脚本基础概念
    一、Shell脚本基础概念1.1 什么是shell?shell英文翻译过来是外壳的意思,作为计算机语言来理解可以认为它是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的shell命令就包括ls、cd、pwd等等。shell是站在内核的基础上编写的一个应用程序,它连接了用户和Linux内核,从而让用户能够更加便捷、高效、安全的使用linux内核,这其实就是shell的本质。使用专业术语的说法来解释,Shell其实是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。1.2 什么是shell脚本shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。1.3 shell脚本的意义我们在1.2中也解释道shell脚本其实就是shell命令组成的文件,shell脚本可以记录命令执行的过程和执行逻辑,以便以后重复执行,还可以批量、定时处理主机,方便管理员进行设置或者管理。二、创建一个简单的Shell脚本2.1 创建一个shell脚本文件在创建shell脚本时,我们默认新建一个以.sh/.script结尾的文件,主要是为了让程序员更加快捷的辨认出该文件是一个shell脚本文件。我们创建一个test.sh的shell脚本文件,其中具体内容为下:#!/bin/bash``echo` `hello" # ”开头的就是注释,单行注释<<EOF … EOF 或 :<<! … ! :多行注释#!/bin/bash : 主要用于指定解释器Linux中提供的shell解释器有:/bin/sh/bin/bash/usr/bin/sh/usr/bin/bash2.2 运行一个Shell脚本我们根据脚本文件是否具有可执行权限,将运行一个shell脚本的方法分为两大类。2.2.1 脚本文件无执行权限这种情况下我们有三种方式来运行脚本:手动在环境中开启指定解释器:sh test.sh直接在当前环境中运行的shell中运行脚本:. test.sh直接在当前环境中运行的shell中运行脚本:source test.sh2.2.2 脚本文件有执行权限在这一部分由于我们假设脚本文件有可执行器权限,所以我们使用chmod +x test.sh为我们的test.sh文件增加了可执行权限。我们知道当一个文件具有可执行权限时我们可以使用该文件的路径名直接运行该文件,有两种方式可以运行脚本:1.绝对路径名运行脚本文件绝对路径就是从根目录下开始记录文件路径名,是文件在计算机上真正存在的路径。(如果不知道你的文件路径名,可以在当前位置的shell中使用pwd查询当前所在位置)2../相对路径名的格式运行脚本文件相对路径是指以当前的文件作为起点,相较于当前目录的位置而被指向并且加以引用的文件资源。比如我们知道test.sh文件的绝对路径为/home/westos/Desktop/textcpp/test.sh,那么当我们在testcpp文件夹中时,test.sh文件的相对路径为test.sh。又因为.代表当前所在位置,故而为其实./test.sh其实就是该文件的绝对路径,只是表示的方式不同。三、基本语法3.1 变量变量名其实就是一片内存区域的地址或者可以说是寻址符号,有了变量我们就可以使用一串固定的字符来表示不固定的目标。3.1.1 变量类型在shell中会同时存在三种类型变量。局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行3.1.2 变量操作创建普通变量:name=“test”,组要注意的是等号两边不能有空格。创建局部变量:local name=“test”,使用local修饰的变量在函数体外无法访问,只能在函数体中使用。创建只读变量:name=“only_read” -> readonly name,这种变量不可以被修改。使用变量:echo $name或者echo ${name}删除变量:unset name,删除之后的变量无法被访问,需要注意无法删除只读变量。3.1.3 字符串变量3.1.3.1 字符串变量的创建使用单引号创建:var='test'。 这种方式创建的变量只能原样输出,变量无效,我们可以借用c中的“字符串常量”的定义理解这种特性。除此以外,单引号中不能出现单独的单引号,转义也是不可以的。使用双引号创建:var="my name is ${name}",这种方式创建的字符串变量有效,也可以出现转义符。3.1.3.2 拼接字符串字面量拼接 str01="1""2"或者str01="1"'2',这样就将1和2两个字符拼接在了一起。需要注意的是两个串之间不可以有空格。变量拼接 str03=${part01}${part02}或str04=${part01}"end"或str05="${part01} ${part02}"这三种方式都可以拼接字符串变量。命令拼接 str02= date“end”,这里的date是一个shell命令,需要使用引用,具体如下:str02=```date`````"end"3.1.3.3 获取字符串长度1.使用wc -L命令wc -L可以获取到当前行的长度,因此对于单独行的字符串可以用这个简单的方法获取,另外wc -l则是获取当前字符串内容的行数。echo` `"abc"` `|``wc` `-L2.使用expr length可以获取string的长度expr` `length ${<!--{C}-->str}3.awk获取域的个数但是如果大于10个字符的长度时是否存在问题需要后面确认echo` `"abc"` `|``awk` `-F ``""` `'{print NF}'4.通过awk+length的方式获取字符串长度echo` `“Alex”|``awk` `'{print length($0)}'5.通过echo ${#name}的方式name=Alex``echo` `${``#name}3.1.3.4 提取子字符串1.如下方式:代码意义${varible##*string}从左向右截取最后一个string后的字符串${varible#*string}从左向右截取第一个string后的字符串${varible%%string*}从右向左截取最后一个string后的字符串${varible%string*}从右向左截取第一个string后的字符串例,如下代码:$ MYVAR=foodforthought.jpg``$ ``echo` `${MYVAR``##*fo}运行结果为rthought.jpg2.使用${varible:n1:n2}截取变量varible从n1到n2之间的字符串,可以根据特定字符偏移和长度,来选择特定子字符串,如下代码:$ EXCLAIM=cowabunga``$ ``echo` `${EXCLAIM:0:3}运行结果最终显示cow。3.1.4 数组如果说变量是存储单个变量的内存空间,那么数组就是多个变量的集合,它存储多个元素在一片连续的内存空间中。在bash中,只支持一维数组,不支持多维数组。3.1.3.1 数组定义与引用定义一个数组方式如下:数组名=(元素1 元素2 元素3 ... 元素n)指定数组对应下标的元素进行赋值:数组名[下标]=值同时指定多个数组元素进行赋值:数组名=([下标1]=值1 [下标2]=值2 ... [下标n]=值n)引用数组对应下标的元素:${数组名[下标]}3.1.3.2 遍历数组元素使用for(或while循环)循环遍历数组元素:#!/bin/bash``a=(1 2 3 4 5 6)``for``((i=0; i<10; i++))``do`` ``echo` `"a[$i]=${a[$i]}"``done除此以外我们还可以使用${a[*]}或者${a[@]}来遍历数组元素,具体代码如下:#!/bin/bash``a=(1 2 3 4 5 6)``echo` `${a[*]}``echo` `${a[@]}3.1.3.3 获取数组长度我们可以使用#来获取数组长度,需要注意的是在shell脚本中我们越界访问数组时是不会报错的。#!/bin/bash``a=(1 2 3 4 5 6)``echo` `${a[*]}``echo` `"a len: ${#a[*]}"我们先使用其获取数组中的元素后使用#获取元素个数即可。3.1.3.4 合并数组我们可以如下进行拼接:#!/bin/bash``a=(1 2 3 4 5 6)``b=(``"hello"` `"zhaixue.cc"``)``c=(${a[*]} ${b[*]})这样我们就将两个数组拼接起来了。3.1.3.5 删除数组元素如果我们想要删除某个数组元素,具体代码如下:#!/bin/bash``a=(1 2 3 4 5 6)``echo` `${a[*]}``echo` `"a len: ${#a[*]}"``unset` `a[5]``echo` `${a[*]}``echo` `"a len: ${#a[*]}"执行结果如下:我们如果要删除整个数组,可以执行unset a,举例代码如下:#!/bin/bash``a=(1 2 3 4 5 6)``echo` `${a[*]}``echo` `"a len: ${#a[*]}"``unset` `a``echo` `${a[*]}``echo` `"a len: ${#a[*]}"3.1.5 变量传参相关的变量含义为:变量含义$0代表执行的文件名$1代表传入的第1个参数$n代表传入的第n个参数$#参数个数$*以一个单字符串显示所有向脚本传递的参数。$@与$相同,但是使用时加引号,并在引号中返回*每个参数$$脚本运行的当前进程号$!后台运行的最后一个进程的ID$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。3.2 运算符原生的bash并不支持简单的数学运算,通常要通过其它命令来实现。3.2.1 算数运算符以下表格中的a和b都是变量。运算shell中格式加法expr $a + $b减法expr $a - $b乘法expr $a \* $b除法expr $b / $a取余expr $b % $a赋值a=$b相等[ $a == $b ]不相等[ $a != $b ]需注意:条件表法式需要放在方括号之间,并且要有空格。使用expr进行计算时需要使用反引号,为了让读者更容易理解,给出下列示例代码。#!/bin/bash``a=10``b=20` `val=```expr` `$a + $b```echo` `"a + b : $val"3.2.2 关系运算符关系运算符只支持数字,不支持字符串,除非字符串的值是数字。运算shell中的实现主要符号检测两个数是否相等[ $a -eq $b ]-eq检测两个数是否不相等[ $a -ne $b ]-ne检测左边的数是否大于右边的[ $a -gt $b ]-gt检测左边的数是否小于右边的[ $a -lt $b ]-lt检测左边的数是否大于等于右边的[ $a -ge $b ]-ge检测左边的数是否小于等于右边的[ $a -le $b ]-le举例代码如下:#!/bin/bash``a=1``b=2` `if` `[ $a != $b ]``then`` ``echo` `"$a != $b : a 不等于 b"``else`` ``echo` `"$a == $b: a 等于 b"执行结果如下:3.2.3 布尔运算符具体如下:运算shell中的实现主要符号非运算[ ! false ]!或运算[ $a -lt 20 -o $b -gt 100 ]-o与运算[ $a -lt 20 -a $b -gt 100 ]-a3.2.4 逻辑运算符具体如下:运算shell中的实现主要符号逻辑的 AND[[ $a -lt 100 && $b -gt 100 ]]&&逻辑的 OR[[ $a -lt 100 `布尔运算符和逻辑运算符的区别:语法上,逻辑运算需要双括弧,布尔运算只需要单大括弧功能上,逻辑运算具有特殊的短路功能,即是在AND运算中第一个表达式为false时则不执行第二个表达式,在OR运算中第一个表达式为true时不执行第二个表达式。3.2.5 字符串运算符下表列出了常用的字符串运算符:运算shell中的实现主要符号检测两个字符串是否相等[ $a = $b ]=检测两个字符串是否不相等[ $a != $b ]!=检测字符串长度是否为0[ -z $a ]-z检测字符串长度是否不为 0[ -n “$a” ]-n检测字符串是否为空[ $a ]$3.2.6 文件测试运算符主要用于检测unix文件的各种属性:运算shell中的实现主要符号检测文件是否是块设备文件[ -b $file ]-b file检测文件是否是字符设备文件[ -c $file ]-c file检测文件是否是目录[ -d $file ]-d file检测文件是否是普通文件(既不是目录,也不是设备文件)[ -f $file ] 返回 true-f file检测文件是否设置了 SGID 位[ -g $file ]-g file检测文件是否设置了粘着位(Sticky Bit)[ -k $file ]-k file检测文件是否是有名管道[ -p $file ]-p file检测文件是否设置了 SUID 位[ -u $file ]-u file检测文件是否可读[ -r $file ]-r file检测文件是否可写[ -w $file ]-w file检测文件是否可执行[ -x $file ]-x file检测文件是否为空(文件大小是否大于0)[ -s $file ]-s file检测文件(包括目录)是否存在[ -e $file ]-e file举例如下:#!/bin/bash``file``=``"/home/westos/Desktop/textcpp/test.sh"``if` `[ -r $``file` `]``then`` ``echo` `"文件可读"``else`` ``echo` `"文件不可读"``fi
  • [问题求助] 昇腾推理基础镜像的CentOS版本支持openEuler吗?
    昇腾推理基础镜像的CentOS版本支持openEuler吗?https://ascendhub.huawei.com/#/detail/ascend-infer
  • [分享交流] openeuler相比于其他操作系统的优势有哪些?
    openeuler相比于其他操作系统的优势有哪些?
  • [openEuler] openEuler 制作驱动镜像文件
    随着板卡芯片不断更新,操作系统中的驱动可能不支持新的芯片,所以需要升级驱动。在所有的硬件中,raid卡驱动是一种比较特殊的驱动,如果操作系统不支持raid卡,在安装系统过程中就无法识别raid卡下的硬盘,导致系统无法正常安装。这种情况下,我们可以通过制作raid卡驱动镜像文件,辅助升级系统驱动,达到安装系统的目的。本文主要以raid卡驱动megaraid_sas为例。1. 安装依赖软件包dnf install -y tar rpm-build createrepo genisoimage2. 下载驱动包,进行解压wget cid:link_0tar -xf MR_LINUX_DRIVER_7.22-07.722.02.00-2.tgz3. 进入源码包目录,安装驱动源码包cd kmod_srpm/rpm -ivh kmod-megaraid_sas-07.722.02.00-2.src.rpm4. 查看 megaraid_sas.spec 文件ls -l /root/rpmbuild/SPECS/megaraid_sas.spec5. 编译spec文件,生成驱动rpm包    【注意:编译环境和架构要求和待安装操作系统相同】rpmbuild -ba /root/rpmbuild/SPECS/megaraid_sas.spec6. 创建制作目录,将编译好的驱动软件包复制到目录下  mkdir -p driver/rpms/aarch64       cp /root/rpmbuild/RPMS/aarch64/kmod-megaraid_sas-07.722.02.00-2.aarch64.rpm driver/rpms/aarch64/       cp /root/rpmbuild/RPMS/aarch64/kmod-megaraid_sas-07.722.02.00-2.aarch64.rpm driver7. 创建rhdd3文件echo "Driver Update Disk version 3" > driver/rhdd3 8. 使用createrepo命令创建repodatacreaterepo --pretty driver/rpms/aarch64/createrepo --pretty driver9. 制作驱动镜像文件mkisofs -R -V "Driver" -o megaraid_sas.iso driver10. 验证驱动镜像文件      驱动镜像文件可以被正常挂载识别            
总条数:120 到第
上滑加载中